یکی از سه عنصر اصلی الگوی طراحی MVC کنترلرها هستند.
در فایل routing.php می توانیم درخواست ها را به یک کنترلر و اکشن خاصی ارسال کنیم به طور مثال آدرس http://www.example.com/user/5 را در مثال زیر به کنترلر UserController و اکشن showProfile هدایت می کند.
Route::get('user/{id}', 'UserController@showProfile');
تعریف کنترلر: کنترلر ها در مسیر دایرکتوری app/Http/Controllers قرار می گیرند.
<?php namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
class UserController extends Controller {
public function showProfile($id) }
return view('user.profile', ['user' => User::findOrFail($id)]);
}
}
کنترلرها و فضای نام (namespace)
برای هرکلاس باید namespace آن را تعریف کنیم که این فضای نام در واقع مسیر قرارگیری کلاس از پوشه app می باشد و برای کنترلرها App\Http\Controllers تعریف می کنیم. در صورتی که داخل دایرکتوری Controllers یک دایرکتوری دیگر مثال به نام Auth ایجاد کرده باشیم و کنترلری در آن تعریف کنیم فضای نام به صورت Namespace App\Http\Controllers\Auth می باشد.
نکته : همیشه نام کلاس های کنترلر را به صورت PascalCase و در انتهای آن کلمه Controller را بیاورید. بهتر است اکشن ها را هم به صورت camelCase نامگزاری کنید.
البته بهتر هست که کنترلر و مدل را با ترمینال ایجاد و شما هم می توانید با این دستور یک کنترلر بدون هیچ متدی ایجاد کنید:
php artisan make:controller UserController –plain
استفاده از middleware در کنترلر
همانطور که در پست قبلی توضیح دادم می توانیم برای هر مسیر خاص یک کلاس میان افزار اضافه کنیم تا درخواست ها فیلتر شوند. مثال در مثال زیر برای مسیر میان افزار auth را اضافه کردیم
Route::get('profile', [
'middleware' => 'auth',
'uses' => 'UserController@showProfile'
]);
در مثال زیر همانطور که مشاهده می کنید سه مثال از استفاده از میان افزار در کنترلرها را آورده است که در متد سازنده کلاس هم قرار می گیرند :
class UserController extends Controller {
public function __construct(){
$this->middleware('auth');
$this->middleware('log', ['only' => ['fooAction', 'barAction']]);
$this->middleware('subscribed', ['except' => ['fooAction', 'barAction']]);
}
}
در مثال دوم میان افزار را با استفاده از کلمه only فقط به اکشن های fooAction و barAction محدود کردیم و فیلتر فقط به این اکشن ها اعمال شود و در مثال سوم با استفاده از کلمه except میان افزار به همه اکشن ها اعمال شود به جز اکشن های fooAction و.barActio
در لاراول همچنین می توانیم به مسیردهی به یک اکشن را به صورتی ساده تر هم انجام دهیم مثال با تعریف مسیر به این صورت:
Route::controller('users', 'UserController');
با افزودن درخواست http به ابتدای نام اکشن با توجه به نوع درخواست به اکشن مورد نظر تحویل داده می شود:
class UserController extends BaseController {
public function getIndex() {
//
}
public function postProfile() {
//
}
public function anyLogin() {
//
}
}
نکته : اگر می خواهید برخی از مسیرها را نامگزاری کنید کافیست پارامتر سومی هم به صورت آرایه در نظر بگیرید و کلید آرایه نام اکشن و مقدار آن نام مسیر باشد:
Route::controller('users', 'UserController', [
'anyLogin' => 'user.login'
]);
کنترلرهایRESTful
در لاراول می توانیم با دستور زیر در ترمینال کنترلرهایی با اکشن های خاصی ایجاد کنیم که هر اکشن یک مسیر و درخواست http را تحویل میگیرند. به طور مثال کنترلر PhotoController را ایجاد می کنیم:
php artisan make:controller PhotoController
مسیر را هم به این صورت در فایل routes.php تعریف می کنیم:
Route::resource('photo', 'PhotoController');
حالا اگر url را به صورت http://www.example.com/photo بنویسیم اکشن index درخواست را دریافت میکند. در تصویر زیر می توانید اطلاعات کاملی را از تمام اکشن ها داشته باشید. verb نوع درخواست http و path مسیری که در url وارد میکنیم و action اکشنی که این درخواست را دریافت میکند و route name هم نام مسیر می باشد.
همچنین می توانیم فقط اکشن های خاصی را به صورت RESTful تعریف کنیم:
Route::resource('photo', 'PhotoController', ['only' => ['index', 'show']]);
Route::resource('photo', 'PhotoController', ['except' => ['create', 'store', 'update', 'destroy']]);