نسخه:

کنترلرهای HTTP

معرفی

به جای تعریف تمام منطق رسیدگی به درخواست خود در یک routes.php فایل، ممکن است بخواهید این رفتار را با استفاده از کلاس های Controller سازماندهی کنید. کنترلرها می توانند منطق رسیدگی به درخواست HTTP مرتبط را در یک کلاس گروه بندی کنند. کنترلرها معمولاً در app/Http/Controllers دایرکتوری ذخیره می شوند.

کنترل کننده های پایه

در اینجا نمونه ای از یک کلاس کنترل کننده اصلی آورده شده است:

<?php namespace App\Http\Controllers;
 
use App\Http\Controllers\Controller;
 
class UserController extends Controller {
 
/**
* Show the profile for the given user.
*
* @param int $id
* @return Response
*/
public function showProfile($id)
{
return view('user.profile', ['user' => User::findOrFail($id)]);
}
 
}

ما می‌توانیم به اکشن کنترلر مانند زیر مسیریابی کنیم:

Route::get('user/{id}', 'UserController@showProfile');

توجه: همه کنترلرها باید کلاس کنترل کننده پایه را گسترش دهند.

کنترلرها و فضاهای نام

توجه به این نکته بسیار مهم است که ما نیازی به تعیین فضای نام کنترلر کامل نداریم، فقط بخشی از نام کلاس را که بعد از فضای App\Http\Controllers نام "root" قرار می گیرد، مشخص کنیم. به طور پیش فرض، فایل را در یک گروه مسیر حاوی فضای نام کنترل کننده ریشه RouteServiceProvider بارگیری می کند . routes.php

اگر می‌خواهید کنترل‌کننده‌های خود را با استفاده از فضاهای نام PHP عمیق‌تر در App\Http\Controllers فهرست قرار دهید یا سازمان‌دهی کنید، به سادگی از نام کلاس خاص نسبت به App\Http\Controllers فضای نام ریشه استفاده کنید. بنابراین، اگر کلاس کنترلر کامل شما باشد App\Http\Controllers\Photos\AdminController ، مسیری مانند این را ثبت می کنید:

Route::get('foo', 'Photos\AdminController@method');

نامگذاری مسیرهای کنترلر

مانند مسیرهای بسته، می‌توانید نام‌هایی را در مسیرهای کنترل‌کننده مشخص کنید:

Route::get('foo', ['uses' => 'FooController@method', 'as' => 'name']);

URL ها به اقدامات کنترلر

برای ایجاد URL به یک عملکرد کنترلر، از action روش کمکی استفاده کنید:

$url = action('App\Http\Controllers\FooController@method');

اگر می‌خواهید یک URL برای یک عملکرد کنترل‌کننده ایجاد کنید در حالی که فقط از بخشی از نام کلاس نسبت به فضای نام کنترلر خود استفاده می‌کنید، فضای نام کنترل‌کننده ریشه را با تولیدکننده URL ثبت کنید:

URL::setRootControllerNamespace('App\Http\Controllers');
 
$url = action('FooController@method');

با استفاده از روش زیر می توانید به نام اکشن کنترلر در حال اجرا دسترسی پیدا کنید currentRouteAction :

$action = Route::currentRouteAction();

میان افزار کنترلر

میان افزار ممکن است در مسیرهای کنترلر مانند موارد زیر مشخص شود:

Route::get('profile', [
'middleware' => 'auth',
'uses' => 'UserController@showProfile'
]);

علاوه بر این، می توانید میان افزار را در سازنده کنترلر خود مشخص کنید:

class UserController extends Controller {
 
/**
* Instantiate a new UserController instance.
*/
public function __construct()
{
$this->middleware('auth');
 
$this->middleware('log', ['only' => ['fooAction', 'barAction']]);
 
$this->middleware('subscribed', ['except' => ['fooAction', 'barAction']]);
}
 
}

کنترل کننده های ضمنی

لاراول به شما این امکان را می دهد که به راحتی یک مسیر واحد برای انجام هر عمل در یک کنترلر تعریف کنید. ابتدا مسیر را با استفاده از Route::controller روش زیر تعریف کنید:

Route::controller('users', 'UserController');

این controller روش دو آرگومان را می پذیرد. اولی URI پایه ای است که کنترلر کنترل می کند، در حالی که دومی نام کلاس کنترلر است. در مرحله بعد، فقط روش هایی را به کنترلر خود اضافه کنید، با پیشوند فعل HTTP که آنها به آن پاسخ می دهند:

class UserController extends Controller {
 
public function getIndex()
{
//
}
 
public function postProfile()
{
//
}
 
public function anyLogin()
{
//
}
 
}

متدها index به URI ریشه ای که توسط کنترلر مدیریت می شود پاسخ می دهند، که در این مورد، این است users .

اگر اکشن کنترلر شما حاوی چندین کلمه باشد، می‌توانید با استفاده از نحو "داش" در URI به عمل دسترسی داشته باشید. به عنوان مثال، عملکرد کنترلر زیر در ما UserController به users/admin-profile URI پاسخ می دهد:

public function getAdminProfile() {}

تعیین نام مسیرها

اگر می خواهید برخی از مسیرهای کنترلر را "نام" کنید، می توانید آرگومان سوم را به متد ارسال کنید controller :

Route::controller('users', 'UserController', [
'anyLogin' => 'user.login',
]);

کنترل کننده های منابع RESTful

کنترل‌کننده‌های منابع، ساختن کنترل‌کننده‌های RESTful در اطراف منابع را بدون دردسر می‌سازند. برای مثال، ممکن است بخواهید یک کنترل‌کننده ایجاد کنید که درخواست‌های HTTP مربوط به "عکس‌های" ذخیره شده توسط برنامه شما را مدیریت کند. با استفاده از make:controller دستور Artisan، می توانیم به سرعت چنین کنترل کننده ای ایجاد کنیم:

php artisan make:controller PhotoController

در مرحله بعد، یک مسیر پرمحتوا به کنترلر ثبت می کنیم:

Route::resource('photo', 'PhotoController');

این اعلان مسیر منفرد چندین مسیر را برای انجام انواع اقدامات RESTful در منبع عکس ایجاد می کند. به همین ترتیب، کنترل‌کننده تولید شده قبلاً روش‌هایی را برای هر یک از این اقدامات، از جمله یادداشت‌هایی که به شما اطلاع می‌دهند URI‌ها و افعالی را مدیریت می‌کنند، خواهد داشت.

اقدامات انجام شده توسط کنترل کننده منابع

فعل مسیر عمل نام مسیر
گرفتن /عکس فهرست مطالب photo.index
گرفتن /عکس/ایجاد ايجاد كردن عکس.ایجاد
پست /عکس فروشگاه photo.store
گرفتن /عکس/{عکس} نشان می دهد عکس.نمایش
گرفتن /photo/{photo}/edit ویرایش کنید photo.edit
PUT/PATCH /عکس/{عکس} به روز رسانی photo.update
حذف /عکس/{عکس} از بین رفتن عکس.تخریب

سفارشی کردن مسیرهای منابع

علاوه بر این، می‌توانید تنها زیر مجموعه‌ای از اقدامات را برای انجام در مسیر مشخص کنید:

Route::resource('photo', 'PhotoController',
['only' => ['index', 'show']]);
 
Route::resource('photo', 'PhotoController',
['except' => ['create', 'store', 'update', 'destroy']]);

به طور پیش فرض، تمام اقدامات کنترل کننده منبع یک نام مسیر دارند. با این حال، می توانید این نام ها را با ارسال یک names آرایه با گزینه های خود لغو کنید:

Route::resource('photo', 'PhotoController',
['names' => ['create' => 'photo.build']]);

مدیریت کنترل کننده های منابع تو در تو

برای "تودرتو" کنترل کننده های منبع، از نماد "نقطه" در اعلان مسیر خود استفاده کنید:

Route::resource('photos.comments', 'PhotoCommentController');

این مسیر یک منبع "تودرتو" را ثبت می کند که ممکن است با URL هایی مانند زیر قابل دسترسی باشد: photos/{photos}/comments/{comments} .

class PhotoCommentController extends Controller {
 
/**
* Show the specified photo comment.
*
* @param int $photoId
* @param int $commentId
* @return Response
*/
public function show($photoId, $commentId)
{
//
}
 
}

افزودن مسیرهای اضافی به کنترل کننده های منابع

اگر اضافه کردن مسیرهای اضافی به یک کنترل کننده منبع فراتر از مسیرهای منابع پیش فرض ضروری است، باید آن مسیرها را قبل از تماس خود با Route::resource :

Route::get('photos/popular', 'PhotoController@method');
 
Route::resource('photos', 'PhotoController');

تزریق وابستگی و کنترلرها

تزریق سازنده

کانتینر سرویس لاراول برای حل همه کنترلرهای لاراول استفاده می شود. در نتیجه، می‌توانید هر نوع وابستگی را که ممکن است کنترلر شما در سازنده خود به آن نیاز داشته باشد را تایپ کنید:

<?php namespace App\Http\Controllers;
 
use Illuminate\Routing\Controller;
use App\Repositories\UserRepository;
 
class UserController extends Controller {
 
/**
* The user repository instance.
*/
protected $users;
 
/**
* Create a new controller instance.
*
* @param UserRepository $users
* @return void
*/
public function __construct(UserRepository $users)
{
$this->users = $users;
}
 
}

البته، می‌توانید هر قرارداد لاراول را نیز تایپ کنید . اگر ظرف می تواند آن را حل کند، می توانید آن را تایپ کنید.

روش تزریق

علاوه بر تزریق سازنده، می‌توانید وابستگی‌های متدهای کنترلر خود را نیز تایپ کنید. Request به عنوان مثال، بیایید نمونه را در یکی از روش های خود تایپ کنیم :

<?php namespace App\Http\Controllers;
 
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
 
class UserController extends Controller {
 
/**
* Store a new user.
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
$name = $request->input('name');
 
//
}
 
}

اگر روش کنترلر شما نیز انتظار ورودی از یک پارامتر مسیر را دارد، به سادگی آرگومان های مسیر خود را پس از وابستگی های دیگر فهرست کنید:

<?php namespace App\Http\Controllers;
 
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
 
class UserController extends Controller {
 
/**
* Update the specified user.
*
* @param Request $request
* @param int $id
* @return Response
*/
public function update(Request $request, $id)
{
//
}
 
}

توجه: تزریق روش کاملاً با اتصال مدل سازگار است . کانتینر به طور هوشمندانه تعیین می کند که کدام آرگومان ها محدود به مدل هستند و کدام آرگومان ها باید تزریق شوند.

حافظه پنهان مسیر

اگر برنامه شما منحصراً از مسیرهای کنترلر استفاده می کند، ممکن است از کش مسیر لاراول استفاده کنید. استفاده از حافظه پنهان مسیر، مدت زمان ثبت همه مسیرهای برنامه شما را به شدت کاهش می دهد. در برخی موارد، ثبت مسیر شما حتی ممکن است تا 100 برابر سریعتر باشد! برای ایجاد کش مسیر، کافیست route:cache دستور Artisan را اجرا کنید:

php artisan route:cache

این تمام چیزی است که وجود دارد! فایل مسیرهای ذخیره شده شما اکنون به جای app/Http/routes.php فایل شما استفاده خواهد شد. به یاد داشته باشید، اگر مسیرهای جدیدی اضافه کنید، باید یک مسیر کش جدید ایجاد کنید. به همین دلیل، ممکن است بخواهید این route:cache فرمان را فقط در حین استقرار پروژه خود اجرا کنید.

برای حذف فایل مسیرهای کش شده بدون ایجاد کش جدید، از route:clear دستور زیر استفاده کنید:

php artisan route:clear