کنترل کننده ها
- کنترل کننده های پایه
- فیلترهای کنترلر
- کنترل کننده های ضمنی
- کنترل کننده های منابع RESTful
- رسیدگی به روش های گمشده
کنترل کننده های پایه
به جای تعریف تمام منطق سطح مسیر خود در یک
routes.php
فایل، ممکن است بخواهید این رفتار را با استفاده از کلاس های Controller
سازماندهی کنید.
کنترلکنندهها میتوانند منطق مسیر مرتبط را در یک کلاس گروهبندی کنند، و
همچنین از ویژگیهای چارچوب پیشرفتهتر مانند
تزریق خودکار وابستگی
استفاده کنند .
کنترلرها معمولاً در
app/controllers
دایرکتوری ذخیره می شوند و این دایرکتوری به طور پیش فرض در
classmap
گزینه فایل شما ثبت می شود
composer.json
.
با این حال، کنترلرها از نظر فنی می توانند در هر دایرکتوری یا هر زیر شاخه
ای زندگی کنند.
اعلان مسیرها به محل فایل کلاس کنترلر روی دیسک بستگی ندارد.
بنابراین، تا زمانی که Composer بداند چگونه کلاس کنترلر را خودکار بارگذاری
کند، ممکن است در هر جایی که شما بخواهید قرار گیرد.
در اینجا نمونه ای از یک کلاس کنترل کننده اصلی آورده شده است:
class UserController extends BaseController { /** * Show the profile for the given user. */ public function showProfile($id) { $user = User::find($id); return View::make('user.profile', array('user' => $user)); } }
همه کنترلرها باید
BaseController
کلاس را گسترش دهند.
همچنین
BaseController
در
app/controllers
دایرکتوری ذخیره می شود و ممکن است به عنوان مکانی برای قرار دادن منطق
کنترلر مشترک استفاده شود.
BaseController
کلاس فریمورک را گسترش می
دهد
Controller
.
اکنون، میتوانیم به این اکشن کنترلر مسیریابی کنیم:
Route::get('user/{id}', 'UserController@showProfile');
اگر میخواهید کنترلر خود را با استفاده از فضاهای نام PHP تودرتو یا سازماندهی کنید، به سادگی از نام کلاس کاملاً واجد شرایط هنگام تعریف مسیر استفاده کنید:
Route::get('foo', 'Namespace\FooController@method');
توجه: از آنجایی که ما از Composer برای بارگیری خودکار کلاسهای PHP خود استفاده میکنیم، کنترلکنندهها ممکن است در هر جایی از سیستم فایل زندگی کنند، تا زمانی که composer بداند چگونه آنها را بارگذاری کند. دایرکتوری کنترلر هیچ ساختار پوشه ای را برای برنامه شما اعمال نمی کند. مسیریابی به کنترلرها به طور کامل از سیستم فایل جدا شده است.
همچنین میتوانید نامهایی را در مسیرهای کنترلر مشخص کنید:
Route::get('foo', array('uses' => 'FooController@method', 'as' => 'name'));
برای ایجاد URL به یک عملکرد کنترلر، می توانید از
URL::action
روش یا
action
روش کمکی استفاده کنید:
$url = URL::action('FooController@method'); $url = action('FooController@method');
با استفاده از روش زیر می توانید به نام اکشن کنترلر در حال اجرا دسترسی
پیدا کنید
currentRouteAction
:
$action = Route::currentRouteAction();
فیلترهای کنترلر
فیلترها ممکن است در مسیرهای کنترلر مشابه مسیرهای "عادی" مشخص شوند:
Route::get('profile', array('before' => 'auth', 'uses' => 'UserController@showProfile'));
با این حال، می توانید فیلترهایی را از داخل کنترلر خود نیز مشخص کنید:
class UserController extends BaseController { /** * Instantiate a new UserController instance. */ public function __construct() { $this->beforeFilter('auth', array('except' => 'getLogin')); $this->beforeFilter('csrf', array('on' => 'post')); $this->afterFilter('log', array('only' => array('fooAction', 'barAction'))); } }
همچنین میتوانید فیلترهای کنترلکننده را با استفاده از یک Close به صورت درون خطی مشخص کنید:
class UserController extends BaseController { /** * Instantiate a new UserController instance. */ public function __construct() { $this->beforeFilter(function() { // }); } }
اگر می خواهید از روش دیگری بر روی کنترلر به عنوان فیلتر استفاده کنید، می
توانید از
@
نحو برای تعریف فیلتر استفاده کنید:
class UserController extends BaseController { /** * Instantiate a new UserController instance. */ public function __construct() { $this->beforeFilter('@filterRequests'); } /** * Filter the incoming requests. */ public function filterRequests($route, $request) { // } }
کنترل کننده های ضمنی
لاراول به شما این امکان را می دهد که به راحتی یک مسیر واحد برای انجام هر
عمل در یک کنترلر تعریف کنید.
ابتدا مسیر را با استفاده از
Route::controller
روش زیر تعریف کنید:
Route::controller('users', 'UserController');
این
controller
روش دو آرگومان را می پذیرد.
اولی URI پایه ای است که کنترلر کنترل می کند، در حالی که دومی نام کلاس
کنترلر است.
در مرحله بعد، فقط روش هایی را به کنترلر خود اضافه کنید، با پیشوند فعل
HTTP که آنها به آن پاسخ می دهند:
class UserController extends BaseController { public function getIndex() { // } public function postProfile() { // } public function anyLogin() { // } }
متدها
index
به URI ریشه ای که توسط کنترلر مدیریت می شود پاسخ می دهند، که در این مورد،
این است
users
.
اگر اکشن کنترلر شما حاوی چندین کلمه باشد، میتوانید با استفاده از نحو
"داش" در URI به عمل دسترسی داشته باشید.
به عنوان مثال، عملکرد کنترلر زیر در ما
UserController
به
users/admin-profile
URI پاسخ می دهد:
public function getAdminProfile() {}
کنترل کننده های منابع RESTful
کنترل کننده های منابع ساخت کنترلرهای RESTful را در اطراف منابع آسان تر می
کنند.
به عنوان مثال، ممکن است بخواهید یک کنترلر ایجاد کنید که "عکس های" ذخیره
شده توسط برنامه شما را مدیریت کند.
با استفاده از
controller:make
دستور از طریق Artisan CLI و
Route::resource
متد، می توانیم به سرعت چنین کنترل کننده ای ایجاد کنیم.
برای ایجاد کنترلر از طریق خط فرمان، دستور زیر را اجرا کنید:
php artisan controller:make PhotoController
اکنون می توانیم یک مسیر پرمحتوا به کنترلر ثبت کنیم:
Route::resource('photo', 'PhotoController');
این اعلان مسیر منفرد چندین مسیر را برای انجام انواع اقدامات RESTful در منبع عکس ایجاد می کند. به همین ترتیب، کنترلکننده ایجاد شده قبلاً برای هر یک از این اقدامات متدهای خرد شده با یادداشتهایی دارد که به شما اطلاع میدهند که کدام URI و افعال را مدیریت میکند.
اقدامات انجام شده توسط کنترل کننده منابع
فعل | مسیر | عمل | نام مسیر |
---|---|---|---|
گرفتن | /منبع | فهرست مطالب | منبع.ایندکس |
گرفتن | /منبع/ایجاد | ايجاد كردن | منبع.ایجاد |
پست | /منبع | فروشگاه | منبع.فروشگاه |
گرفتن | /منبع/{منبع} | نشان می دهد | منبع.نمایش |
گرفتن | /resource/{resource}/edit | ویرایش کنید | منبع.ویرایش |
PUT/PATCH | /منبع/{منبع} | به روز رسانی | منبع.به روز رسانی |
حذف | /منبع/{منبع} | از بین رفتن | منبع.از بین بردن |
گاهی اوقات ممکن است فقط نیاز به مدیریت زیرمجموعه ای از اقدامات منبع داشته باشید:
php artisan controller:make PhotoController --only=index,show php artisan controller:make PhotoController --except=index
و همچنین می توانید زیر مجموعه ای از اقدامات را برای انجام در مسیر مشخص کنید:
Route::resource('photo', 'PhotoController', array('only' => array('index', 'show'))); Route::resource('photo', 'PhotoController', array('except' => array('create', 'store', 'update', 'destroy')));
به طور پیش فرض، تمام اقدامات کنترل کننده منبع یک نام مسیر دارند.
با این حال، می توانید این نام ها را با ارسال یک
names
آرایه با گزینه های خود لغو کنید:
Route::resource('photo', 'PhotoController', array('names' => array('create' => 'photo.build')));
مدیریت کنترل کننده های منابع تو در تو
برای "تودرتو" کنترل کننده های منبع، از نماد "نقطه" در اعلان مسیر خود استفاده کنید:
Route::resource('photos.comments', 'PhotoCommentController');
این مسیر یک منبع "تودرتو" را ثبت می کند که ممکن است با URL هایی مانند زیر
قابل دسترسی باشد:
photos/{photoResource}/comments/{commentResource}
.
class PhotoCommentController extends BaseController { public function show($photoId, $commentId) { // } }
افزودن مسیرهای اضافی به کنترل کننده های منابع
اگر لازم است که مسیرهای اضافی را به کنترل کننده منبع فراتر از مسیرهای
منابع پیش فرض اضافه کنید، باید آن مسیرها را قبل از تماس خود با
Route::resource
:
Route::get('photos/popular', 'PhotoController@method');Route::resource('photos', 'PhotoController');
رسیدگی به روش های گمشده
هنگام استفاده از
Route::controller
, ممکن است یک متد catch-all تعریف شود که زمانی فراخوانی می شود که هیچ روش
تطبیقی دیگری در یک کنترلر مشخص پیدا نشود.
متد باید نامگذاری شود
missingMethod
و متد و آرایه پارامتر درخواست را دریافت می کند:
تعریف یک روش Catch-All
public function missingMethod($parameters = array()){ //}
اگر از کنترلکنندههای منبع استفاده میکنید، باید یک
__call
روش جادویی بر روی کنترلکننده تعریف کنید تا هر روش از دست رفته را مدیریت
کند.