!! تمامی دوره های تاپ دمی رایگان شد !!

آموزش برنامه نویسی - تاپ دمی
آموزش Routing در لاراول

آموزش Routing در لاراول

لاراول

25 شهریور، 1400

در این مقاله آموزش سعی کردیم به صورت کامل و جامع پیاده سازی روت در لاراول (routing) را بررسی کنیم و همه نکات مهم در مسیر دهی لاراول را آموزش دهیم

روتر چیست؟

با وارد کردن آدرس در مرورگر ، وارد صفحه ای از وبسایت مورد نظر می شیم و محتوای آن صفحه را می بینیم . حالا سوالی که هست این کار به چه صورتی انجام میشه؟ در فریمورک لاراول با ساخت یک روت مشخص میکنیم که آدرس وارد شده مارو به کدوم کنترل از برنامه منتقل کنه تا ما بتونیم داخل کنترول پیاده سازی های لازم را انجام بدیم و بعد کاربر را به اون صفحه ایی که میخوایم منتقل کنیم.

تعریف یک روت در لاراول

برای تعریف روت در لاراول داخل پوشه routes میشیم و به دو فایل با نام های web.php و api.php که برای تعریف روت ها هست دسترسی داریم ، فایل api.php برای تعریف api های برنامه هست که میدلویر های اون با فایل web.php فرق دارد. برای تعریف روت به این صورت عمل میکنیم

use Illuminate\Support\Facades\Route;

Route::get('/greeting', function () {
    return 'Hello World';
});

در مثال بالا میبینید که نوع درخواست رو get تعریف کردیم که این متد دوتا پارامتر میگیره یکی آدرس و دومی اکشن که بعد از رفتن به آدرس باید کاری که در اکشن نوشتیم انجام بشه که ومثال بالا میتونیم داخل یک کلوژر فانکش کدهای خودمون رو بنویسیم یا ادرس یک کنترلر که از قبل تعریف کردیم که پیشنهاد میکنم از کنترل استفاده کنید برای اینکار. برای درخواست های دیگمون هم میتونیم روت تعیرف کنیم :

Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);

یک نکته ایی که هست ما دو نوع دیگه روت میتونیم تعریف کنیم اون دوتا روهم باهم بررسی میکنی:

Route::match(['get', 'post'], '/', function () {
    //
});

روت match این امکان رو به ما میده که بتونیم همزمان چند تا درخواست رو پشتیبانی کنیم یعنی مثل بالا هم get و هم post رو روت ما پشتیبانی میکنه که هرچند تا که لازم داشتیم رو کافی داخل ارایه قرار بدیم. حالا اگه نوع درخواست هایی که خواستین استفاده کنید زیاد بود یا خواستید همه ی درخواست ها رو روتی که تعریف کردیم پشتیبانی کنه کافی از any استفاده کنیم که این نوع روت به صورت پیش فرض هر درخواستی که به سمتش میاد رو قبول میکنه.

Route::any('/', function () {
    //
});

روتهای ریدایرکت

در برخی از موارد میخوایم آدرس درخواستی را به یک آدرس دیگه بفرستیم در اینصورت از متد redirect استفاده میکنیم

Route::redirect('/here', '/there');

فقط در نظر داشته باشید که ریدایرکت به صورت پیشفرض با کد 302 ارسال می شود و درصورتی که میخواید با یک status کد دلخواه دیگه ریدایرکت کنید باید داخل پارامتر سوم متد ارسال میکنید.

Route::redirect('/here', '/there', statusCode);

روتهای نمایش ویو

در برخی از مواقع ما با درخواست یک آدرس فقط میخوایم یک صفحه را نمایش بدیم و هیچ عملیات دیگه ای لازم نداریم در این صورت میتونیم از متد view استفاده کنیم.

Route::view('/welcome', 'welcome', ['name' => 'mohammad']);

در مثال بالا میبینید که پارامتر اول آدرس درخواستی است و در پارامتر دوم آدرس view که میخوایم نمایش بدیم و پارامتر سوم که به صورت دلخواه هست میتونیم مقادیر دلخواهی را به ویو ارسال کنیم.

روتهای پارامتر دار

بعضی از مواقع ما لازم داریم که در آدرس درخواستی یک یا چند پارامتر به صورت داینامیک قرار بدیم مثلا برای ویرایش یک پست میتونیم id اون پست را داخل آدرس قرار بدیم تا بتونیم بهش دسترسی داشته باشیم پس به یک پارامتر داینامیک نیاز داریم که برای هر پستی متفاوت هست در این صورت باید از روتهای دارای پارامتر استفاده کنیم که توی مثال زیر میتونید ببینید.

Route::get('/post/{id}', function ($id) {
    return post '.$id;
});

پس برای قراردادن پارامتر از {} استفاده میکنیم و بعد هم میتونیم بهش دسترسی داشته باشیم.

و اینکه میشه بیشتر از یک پارامتر هم در روت قرار داد مثلا:

Route::get('/posts/{post}/comments/{comment}', function ($postId, $commentId) {
    //
});

فرض کنید که داخل یک روت پارامتری تعریف کرده اید که باید اون پارامتر هم داخل آدرس وارد کنیم اما گه خواستیم که اون روت بدونه پارامتر هم کار کنه باید چیکار کرد؟ خوب توی این مورد میتونیم پارامتر را به صورت اختیاری قرار بدیم فقط کافی یک ? بعد از نام پارامتر قراربدیم

Route::get('/user/{name?}', function ($name = 'mohammad') {
    return $name;
});

توی مثالا بالا میتونیم نام را وارد نکنیم که به صورت پیشفرض نام mohammad برای ما نمایش داده میشه.

قراردادن محدودیت در روت با استفاده از عبارت منظم

برای اینکه پارامتر ارسالی را مطابق با چیزی که خودمون میخوایم دریافت کنیم میتوینم از عبارت منظم استفاده کنیم برای این کار از where استفاده میکنیم و داخل اون اسم پارامتر و RegEx قرار میدیم.

Route::get('/user/{name}', function ($name) {
    //
})->where('name', '[A-Za-z]+');

Route::get('/user/{id}', function ($id) {
    //
})->where('id', '[0-9]+');

Route::get('/user/{id}/{name}', function ($id, $name) {
    //
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);

همنطور که در بالا میبینید اگه چند تا پارامتر داشتیم میتونیم داخل آرایه قرار بدیم و به where ارسال کنیم. همچنین میتونیم از الگو های زیر هم استفاده کنیم که به سرعت ما کمک میکنه

Route::get('/user/{id}/{name}', function ($id, $name) {
    //
})->whereNumber('id')->whereAlpha('name');

Route::get('/user/{name}', function ($name) {
    //
})->whereAlphaNumeric('name');

Route::get('/user/{id}', function ($id) {
    //
})->whereUuid('id'

نکته : اگر درخواست ارسالی مطابق با شرطی که ما قرار دادیم نیود به صفحه 404 ریدایرکت میشه.

نام گذاری روت ها

برای نام گذاری کردن روت ها بعد از تعریف روت از متد name استفاده میکنیم و نامی که مدنظرمون هست رو به روت میدیم.

Route::get(
    [UserProfileController::class, 'show']
)->name('profile');

توی مثال بالا یک روت از نوع get تعریف کردیم که به کنترولر یوزر پروفایل میره و بعد از آن نام این روت رو profile گذاشتیم. حلا برای این که بتونیم از نام روت استفاده کنیم برای دسترسی بهش از تابع route() استفاده میکنیم که نام روت را دریافت میکنه و همچنین اگر روت نام گذاری شده داری پارامتر بود برای ارسال پارامتر ، داخل یک آرایه پارامتر های لازم را به تابع روت میدیم.

Route::get('/user/{id}/profile', function ($id) {
    //
})->name('profile');

$url = route('profile', ['id' => 1]);

گروه بندی روت ها

بعد از تعریف بعضی از روت ها میبینید که قسمت هایی از آنها مشترک هستند مثل میدلور و Prefix یا Namespace که میتوانیم این ویژگی های مشترک رو برای گروهی از روت ها تعریف کنیم تا نیاز به مشخص کردن این ویژگی ها برای هر روت نباشه.

Route::get('/user/profile,  'user\UsersController') ->middleware('auth');
Route::get('/user/post,  'user\userController') ->middleware('auth');

    Route::group(['namespace' => 'user', 'prefix' => user, 'middleware' => 'auth'], function() {
    Route::get('/profile, 'user\UsersController');
    Route::get('/posts', 'user\userController');
});

برای برخی از روت ها که با نام های مشابه شروع میشوند مثل روت های user یا روت های admin میتونیم این پیوند نام ها رو هم داخل ویژگی های مشترک گروها اضافه کنیم.

Route::name('admin.')->group(function () {
    Route::get('/users', function () {
        // Route assigned name "admin.users"...
    })->name('users');
});

در دوره آموزش پروژه محور nuxt و laravel به صورت کامل به نوشتن api ها و مبحث Route در لاراول آشنا می شوید.

امیدوارم که این مقاله آموزشی برای شما مفید باشد.

توسعه دهنده وب

تقريبا ٩ سال از اولين سايتي كه طراحي كردم ميگذره ، این اشتیاق از آن زمان ادامه پیدا کرد که در نهایت من به عنوان یک توسعه دهنده وب مشغول به كار شدم. طي اين سال ها تجربه اي كه از شركت در پروژه ها و چالش هاي ياگيري برنامه نویسی بدست آوردم ، تصميم گرفتم كه اين تجربه رو با بقيه اشتراك بزارم كه نتیجه ی آن شد تاپ دمی.

مقالات مشابه