کنترلرهای HTTP
- معرفی
- کنترل کننده های پایه
- میان افزار کنترلر
- کنترل کننده های ضمنی
- کنترل کننده های منابع RESTful
- تزریق وابستگی و کنترلرها
- حافظه پنهان مسیر
معرفی
به جای تعریف تمام منطق رسیدگی به درخواست خود در یک
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