از مزیت های فریمورک لاراول نسبت به سایر فریمورک های PHP مبحث Routing آن است که می توان مدیریت خوبی روی مسیرها داشت.
در مسیر app/Http و فایل routes.php می توانیم تمامی مسیرهای برنامه را در آنجا تعریف و مدیریت کنیم.این فایل توسط کلاس App\Providers\RouteServiceProvider بارگزاری می شود.
یک مثال ساده:
Route::get('/', function() {
return 'Hello World';
});
کلاس Route چند متد دارد که نوع درخواست http را مشخص میکند. در مثال بالا متد get فقط در خواست های GET به این مسیر را قبول میکند. سایر متدها که نوع درخواست http را مشخص میکنند delete, patch, put , postمی باشند. این متد دوتا پارامتر می گیرد که اولی مسیری است که بعد از نام دامنه سایت می آید مثال در آدرس http://www.example.com/about مسیری که وارد میکنیم about است .
در پارامتر دومی هم می توانیم بدون استفاده از کنترلر و اکشن و با دادن یک تابع بی نام در همین روتر آن را مدیریت کنیم.
کلاس Route دارای متد دیگری به نام match هست که می توانیم چند نوع درخواست http را به یک مسیر مجاز کنیم در مثال زیر مسیر هردونوع درخواست GET و POST را قبول می کند :
Route::match(['get', 'post'], '/', function() {
return 'Hello World';
});
در صورتی که بخواهیم مسیر همه در خواست ها را قبول کنید از متد any استفاده میکنیم مثال آدرس http://www.example.com/foo هر درخواستی را قبول میکند :
Route::any('foo', function() {
return 'Hello World';
});
HTML درخواست های DELETE , PUT یا PATCH را پشتیبانی نمی کند برای اینکه یک فرم HTML را با این متدها تعریف کنیم کافیه یک تگ input از نوع hidden و با نام method _تعریف میکنیم و به value آن یکی از مقادیر PATCH, DELETE, PUT را بدهید مثال:
<form action=”/foo/bar” method=”POST”>
<input type=”hidden” name=”_method” value=”PUT”>
<input type=”hidden” name=”_token” value=”<?php echo csrt_token();?>”>
</form>
در مثال بالا آدرس http://www.example.com/foo/bar در روتر با متد put قابل دریافت است که می توانیم برای PATCH , DELETE هم به همین صورت عمل کنیم. کاربرد این متدها را در بخش کنترلر ها تشریح خواهم کرد. همچنین یک تگ از نوع مخفی به نام _token هم در فرم وجود دارد که در یک پست جداگانه در مورد فرم ها و کار با آنها توضیح خواهم داد.
مسیر با پارامتر
به همراه مسیر می توانیم هر تعداد پارامتر را هم ارسال کنیم فقط کافی است نام پارامترها را داخل آکوالد قرار دهیم. به مثال های زیر توجه کنید:
Route::get('user/{id}', function($id) {
return 'User '.$id;
});
Route::get('user/{name?}', function($name = null) {
return $name;
});
Route::get('user/{name?}', function($name = 'John') {
return $name;
});
در مثال های بالا همانطور که مشاهده کردید می توانیم برای پارامترها یک مقدار پیش فرض یا null هم در نظر گرفت تا درصورت وارد نکردن مقداری برای پارامتر در url خطایی ایجاد نشود. همچنین باید جلوی نام پارامتر های اختیاری یک عالمت ? قرار دهیم.
افزودن عبارت منظم به پارامتره
می توانیم با افزودن متد where به انتهای متد get برای هر پارامتر یک عبارت منظم هم تعریف کرد تا مثال id فقط مقدار عدد مورد قبول باشد. در صورتی که چند پارامتر را بخواهیم برایش عبارت منظم تعریف کنیم آنها را داخل آرایه قرار می دهیم.
Route::get('user/{id}/{name}', function($id, $name) {
//
}) ->where(['id' => '[0-9]+', 'name' => '[a-z]+'])
همچنین می توانیم برای یک پارامتر خاص در کل برنامه یک عبارت منظم عمومی تعریف کنیم به این صورت که در کلاس RouteServiceProvider در دایرکتوری app/Providers در متد boot این عبارت را قرار دهیم مثال در مثال زیر کاربر در routing هرجایی از پارامتر id استفاده کرد فقط مجاز به دادن مقدار عددی به آن است و دیگر مانند بالا نیاز به تعریف متد where نیست :
$router->pattern('id', '[0-9]+');
مسیردهی به یک کنترلر و اکشن
Route::get('user/{id}', 'UserController@showProfile');
در پارامتر دوم فقط کافی است بین نام کلاس کنترلر و اکشن یک عالمت @ قرار دهیم.
نامگزاری مسیر
با استفاده از کلمه as می توانیم برای مسیر یک نام هم تعریف کنیم و همچنین با استفاده از uses می توانیم آن را به اکشن و کنترلر خاصی هدایت کنیم.
Route::get('user/profile', [
'as' => 'profile', 'uses' => 'UserController@showProfile'
]);
از کاربردهای نامگزاری مسیر برای ایجاد و ساختن url است که می توانیم با استفاده از تابع کمکی route نام مسیر را به آن بدهیم مثال در مثال بالا با دادن نام profile آدرس http://www.example.com/user/profile ایجاد خواهد شد و همچنین برای ریدایرکت به یک مسیر هم کاربرد دارد.
$url = route('profile');
$redirect = redirect()->route('profile');
مسیردهی گروهی
در لاراول می توانیم یک دسته از مسیرها را که مثال در یک قسمت از url خود مشترک هستند یا middleware مشترکی دارند و یا دارای یک namespace مشترک هستند را در یک گروه قرار دهیم. همچنین می توانیم domain-sub ها را از این طریق مدیریت کنیم.
Route::group(['prefix' => 'admin'], function() {
Route::get('users', function() {
// Matches The '/admin/users' URL
});
})
در مثال بالا تمامی مسیرهایی که با admin شروع می شوند را داخل این گروه قرار می دهیم.
برای اطلاعات و مثال های بیشتر در این مورد می توانید به اینجا مراجعه کنید.