یکی از سه عنصر اصلی الگوی طراØÛŒ 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']]);