کار با کنترلرها
یکی از سه عنصر اصلی الگوی طراحی 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 {
/**
* Show the profile for the given user.
*
* @param int $id
* @return Response
*/
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 {
/**
* Instantiate a new UserController instance.
*/
public function __construct()
{
$this->middleware('auth');
$this->middleware('log', ['only' => ['fooAction', 'barAction']]);
$this->middleware('subscribed', ['except' => ['fooAction', 'barAction']]);
}
}
در مثال دوم میان افزار را با استفاده از کلمه only فقط به اکشن های fooAction و barAction محدود کردیم و فیلتر فقط به این اکشن ها اعمال شود و در مثال سوم با استفاده از کلمه except میان افزار به همه اکشن ها اعمال شود به جز اکشن های fooAction و barAction.
در لاراول همچنین می توانیم به مسیردهی به یک اکشن را به صورتی ساده تر هم انجام دهیم مثلا با تعریف مسیر به این صورت :
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 هم نام مسیر می باشد.
Screenshot from 2015-04-19 13:08:32.png
همچنین می توانیم فقط اکشن های خاصی را به صورت RESTful تعریف کنیم :
Route::resource('photo', 'PhotoController',
['only' => ['index', 'show']]);
Route::resource('photo', 'PhotoController',
['except' => ['create', 'store', 'update', 'destroy']]);
برای اطلاعات تکمیلی به اینجا مراجعه کنید