مسیریابی در لاراول
فهرست
- مفاهیم پایه مسیریابی
- استفاده از چند متد مسیریابی بصورت همزمان
- انتقال به سایر مسیر ها
- انتقال به یک view
- مسیریابی با پرامتر
- مسیریابی با پارمتر اختیاری
- اعتبارسنجی پارامترها در مسیریابی
- whereNumber
- whereAlpha
- whereAlphaNumberic
- whereIn
- where
- نامگذاری برای مسیرها
- گروهبندی مسیرها
- مسیرهای خطا
- مشاهده لیست مسیرها
- کش کردن مسیرها
(Routing) به فرآیند هدایت درخواستهای کاربر به منابع مناسب در سرور را مسیر دهی می گویند بعنوان مثال کاربر میخواهد مشخصات یک محصول را مشاهده کند
http://local/product/12
در لاراول، مفهوم مسیردهی (Routing) به شما این امکان را میدهد که درخواستهای ورودی (URLها) را به کنترلرها یا نمای (View)های مناسب هدایت کنید یا دستورات مناسب را بر اساس مسیر اجرا کنید
- اجرای یک تابع
- اجرای یک متد از controller
- نمایش یک view
متدهای route
با استفاده از متدهای زیر میتونیم مسیر های دلخواه را از کاربر دریافت کنیم
| برای دریافت اطلاعات از url استفاده میشود | route::get($uri,$callback) |
| برای ایجاد اطلاعات از post استفاده میشود | route::post($uri,$callback) |
| برای بروزرسانی اطلاعات استفاده میشود | route::put($uri,$callback) |
| برای بروزرسانی اطلاعات استفاده میشود | route::patch($uri,$callback) |
| برای حذف اطلاعات استفاده میشود | route::delete($uri,$callback) |
| برای دریافت اطلاعات بیشتر درباره یک روت مشخص استفاده میشود | route::options($uri,$callback) |
انواع مسیر دهی در لاراول
1. مسیردهی ساده ،نمایش یک view مشخص برای تعریف یک مسیر ساده، میتوان از متدهای HTTP مانند get، post، put، delete و patch استفاده کرد:
Route::get('/about', function () {
return view('about');
});
در این مثال، درخواست مسیر /about به نمای about.blade.php هدایت میشود.
2. مسیردهی با پارامتر
برای دریافت پارامتر از URL، میتوان از متغیرهای درون آکولاد استفاده کرد:
Route::get('/user/{id}', function ($id) {
return 'User ' . $id;
});
در این مثال، مقدار id از URL استخراج شده و در متغیر $id قرار میگیرد.
2.1.فیلتر کردن پارامترها
برای فیلتر کردن میتوانیم از where استفاده کنیم
- whereNumber بررسی میکند ورودی مورد نظر تنها عدد باشد
- WhereAlpha بررسی میکند ورودی مورد نظر رشته باشد
- whereAlphaNumeric هم عدد و هم رشته باشد
- where از عبارت regx استفاده میکند
مثال:
Route::get('/user/{id}', function ($id) {
return 'User ' . $id;
})->whereNumber('id')
مثال:در درخواست ارسالی id باید عددی باشد و message رشته ای
Route::get('/user/{id}/message/{string}', function ($id,$string) {
return 'User :' . $id.'message:'.$string;
})->whereNumber('id')->WhereAlpha ('string')
مثال:در درخواست ارسالی نام کاربری فقط حروف کوچک و بزرگ باشد
Route::get('/user/{userName}',function($userName){
//
})->where('userName',[a-Z]+)
مثال:ایجاد محدودیت برای زبان و شناسه درخواستی
Route::get('/{lang}/page/{id}',function($lang,$id){
//
})->where(['lang'=>'[a-z]{2}','id'=>'\d{4,}')
مثال: امکان تکرار هر کراکتر حتی / داخل درخواست
Route::get('/search/{search}',function($search){
return($search)
})->where(['search'=>'.+')
3.مسیردهی به کنترلر:اجرای یک متد از یک کنترولر
برای هدایت درخواستها به متدهای کنترلر، استفاده می شود
Route::get('/posts', [PostController::class, 'index']);
در اینجا، درخواست مسیر /posts به متد index در PostController هدایت میشود.
4.مسیردهی با نام (Named Routes)
برای نامگذاری مسیرها و استفاده از آنها در سایر بخشهای برنامه، میتوان از متد name استفاده کرد:
4.1. جلوگیری از تکرار URLها در کد (DRY Principle)
به جای استفاده مستقیم از آدرسها در چندین بخش برنامه (مثل لینکها، ریدایرکتها و ...)، از نام مسیر استفاده میکنیم تا اگر URL تغییر کرد، فقط نیاز به اصلاح در یک مکان باشد.
بدون Named Route (مشکل تکرار و خطا):اگر /post را تغییر دهیم باید در تمام لینک ها تغییر ایجاد کنیم | نمایش پست |
با Named Route (کد تمیز و قابل مدیریت):در صورت نیتز به تغییر تنها روت را تغییر میدهیم | Route::get('/posts/{slug}', [PostController::class, 'show'])->name('posts.show'); |
4.2. ریدایرکتهای آسان (Redirects)
میتوانید به جای آدرسدهی مستقیم، از نام مسیر برای ریدایرکت استفاده کنید.
return redirect()->route('profile', ['id' => 1]);
برای تولید URL مربوط به این مسیر، میتوان از تابع route استفاده کرد:
4.3. استفاده در فرمها (Form Actions)
Route::post('/posts', [PostController::class, 'store'])->name('posts.store');
@csrf
ذخیره
5.مسیردهی در کنترلرها (Controller Routes)
return redirect()->route('dashboard');
6. مسیردهی با گروهبندی
برای گروهبندی مسیرها با ویژگیهای مشترک مانند پیشوند URL، نام مشترک یا میانهافزار (Middleware)، میتوان از متد prefix، name و middleware استفاده کرد:
مثال: تمامی مسیرهای داخل گروه با پیشوند /admin خواهند بود.
Route::prefix('admin')->group(function () {
Route::get('/dashboard', function () {
// ...
});
});
7.مسیردهی پیشفرض (Fallback Routes)
برای تعریف مسیری که در صورت عدم تطابق سایر مسیرها با درخواست، اجرا شود، میتوان از متد fallback استفاده کرد:
Route::fallback(function () {
return view('404');
});
این مسیر باید آخرین مسیر تعریفشده باشد تا در صورت عدم تطابق سایر مسیرها، اجرا شود.
8.مسیریابی که شامل چندین روت همزمان باشد
Route دارای متدی به نام matchهست که می توانیم چندنوع درخواستhttp را به یک مسیر مجاز کنیم در مثال زیر مسیر هر دونوع درخواست GETوPOSTراقبول میکند:
Route::match(['get', 'post'], '/', function()
{
return 'Hello World';
});
9.مسیریابی که شامل همه روت همزمان باشد
در صورتیکه بخواهیم همه خواستها راقبول کنید از متد any استفاده میکنیم مثال http://www.example.com/foo هر درخواستی را قبول میکند:
Route::any('foo', function()
{
return 'Hello World';
});
9.1.مسیریابی انتقال
برای انتقال یک درخواست به مسیر دیگر از redirect استفاده می شود
Route::redirect('/home','/')
مسیر / را به مسیر /home تغییر میدهد
9.2.مسیریابی به یک view
Route::view('/contact','contact')
با مراجعه به مسیر contact/ ویوی contact نمایش داده میشود
9.3.ارسال پارامتر به view
Route::view('/contact','contact',['userId'=>'258'])
در جدول زیر، مهمترین متدها و کاربردهای کلاس Route در لاراول نمایش داده شده است:
| متد/ویژگی | نحوه استفاده | کاربرد | مثال |
|---|---|---|---|
| مسیرهای پایه | |||
| get() | Route::get(uri, callback) | تعریف مسیر GET | Route::get('/users', fn() => 'Users List') |
| post() | Route::post(uri, callback) | تعریف مسیر POST | Route::post('/users', [UserController::class, 'store']) |
| any() | Route::any(uri, callback) | پاسخ به همه متدهای HTTP | Route::any('/contact', ContactController::class) |
| match() | Route::match(methods, uri, callback) | پاسخ به چند متد خاص | Route::match(['get', 'post'], '/login', [AuthController::class, 'login']) |
| مسیرهای Resource | |||
| resource() | Route::resource(uri, controller) | ایجاد تمام مسیرهای CRUD | Route::resource('users', UserController::class) |
| apiResource() | Route::apiResource(uri, controller) | ایجاد مسیرهای API (بدون create/edit) | Route::apiResource('posts', PostController::class) |
| نامگذاری مسیرها | |||
| name() | Route::...->name('route.name') | اختصاص نام به مسیر | Route::get('/profile', fn() => ...)->name('profile') |
| محدودیتها | |||
| where() | Route::...->where('param', 'regex') | اعتبارسنجی پارامترها | Route::get('/user/{id}', ...)->where('id', '[0-9]+') |
| middleware() | Route::...->middleware('middleware') | اعمال میدلور | Route::get('/admin', ...)->middleware('auth') |
| پیشوند و گروهبندی | |||
| prefix() | Route::prefix('admin')->group(...) | اضافه کردن پیشوند به URI | Route::prefix('api')->group(...) |
| group() | Route::group([options], callback) | گروهبندی مسیرها | Route::group(['middleware' => 'auth'], fn() => { ... }) |
| Route Model Binding | |||
| مدل در پارامتر | Route::get('/users/{user}', ...) | تزریق خودکار مدل | Route::get('/users/{user}', fn(User $user) => ...) |
| متدهای کمکی | |||
| view() | Route::view(uri, view, [data]) | بازگرداندن view بدون کنترلر | Route::view('/welcome', 'welcome') |
| redirect() | Route::redirect(from, to, status) | ریدایرکت | Route::redirect('/here', '/there') |
| permanentRedirect() | Route::permanentRedirect(from, to) | ریدایرکت دائم (301) | Route::permanentRedirect('/old', '/new') |