مسیردهی یا routing لاراول

مسیردهی یا routing لاراول

با هر زبان برنامه نویسی که شروع به ساخت سایت یا سرویس تحت وب کنید نیاز به مسیر دهی فایل های مختلف بسیار ضروری می باشد این مسیردهی یا routing، باید بسیار کاربردی، سریع، آسان، قابل دیباگ ، کمترین خطا ، امکان دسته بندی، افزودن پیشوند و پسوند ، افزودن شروط مختلف و ... را داشته باشد. خب پس وجود یک ساختار منسجم همراه با این امکانات بسیاری ضروری در پروژه های برنامه نویسی می باشد. امروزه فریم ورک لاراول بسیار محبوب و کاربردی شده است و ما در این مطلب در مورد مسیردهی یا routing در لاراول آموزش هایی همراه با مثال برای شما عزیزان آماده کرده ایم.

زمان مطالعه: 3 دقیقه
بازدید: 2093
پرسش و پاسخ: 0

فایل های پیش فرض مسیردهی یا routing لاراول

کلیه مسیرها در یک پروژه لاراول در پوشه routes که در ریشه پروژه فعلی شما می باشد کلیه فایل های این پوشه به صورت اتومات در زمان اجرای لاراول در حافظه بارگیری می شوند. دو نوع مسیر دهی در لاراول آماده شده که web.php برای Routing در وب و فایل api.php  برای Routing Api استفاده می شود که هرکدام از این مسیرهای یکسری امکانات ویژه دارند مثلا web.php جلسات (session) و CSRF را دارد و api نیز throttle و ... را دارد.

نکته : یک فایل routes.php در مسیر bootstrap/cache/routes.php به صورت کدگذاری و فشرده شده وجود دارد که نسخه cache شده مسیردهی در لاراول می باشد اغلب اوقات با تغییر مسیر هنوز هم اطلاعات قبلی برای شما نمایش داده می شود که مربوط به این فایل می باشد که یا باید این فایل را حذف کنید یا از خالی کردن کش لاراول استفاده کنید.

نکته : اگر دقت داشته باشید در api لاراول همیشه در اول مسیر دهی کلمه api تکرار می شود برای تغییر این مورد و همچنین تغییر هر قسمت دیگر در مسیردهی و افزودن پیشوند یا پسوند به کل مسیردهی وب یا api لاراول می توانید از فایل RouteServiceProvider استفاده کنید همچنین می توانید فایل دیگری مثل web.php یا api.php تعریف کنید و در فایل RouteServiceProvider اضافه کنید تا به مسیرهای دسته شده شما افزوده شود.

متدهای مسیردهی (Routing) لاراول

  • get
  • post
  • put
  • patch
  • delete
  • options

حتما برای شما اتفاق خواهد افتاد که نیاز داشته باشید یک مسیر نیاز به امکان فراخوانی با تمام متدهای یاد شده یا یک تعداد خاص از این متدها اجرا شود. در لاراول دو نوع مسیردهی با عناوین any و match تعریف شده است که any می تواند تمام متدهای گفته شده را پشتیبانی کند اما در نوع match فقط نوع هایی که در مسیر تعریف می شود قابل دسترس خواهد بود.

Route::match(['get', 'post'], '/', function () {
    // فقط دو نوع یاد شده را قبول می کند
});

Route::any('/', function () {     // تمام موارد را قبول خواهد کرد });

CSRF Protection Routing

توکن CSRF که برای جلوگیری از حملات CSRF در فرم ها تعبیه می شود همراه با متدهای POST, PUT, or DELETE باید ارسال شود در سمت وب، مسیرهای فایل web.php مورد استفاده قرار می گیرد. بعضی از دوستان این توکن را غیرفعال می کنند از طریق فایل kernel.php که کاملا اشتباه است و خطرات بسیاری برای سایت شما ایجاد خواهد کرد. یک نمونه استفاده از این توکن را ببینیم :

@csrf

Redirect مسیر (تغییر مسیر)

بعضی اوقات شما مجبورید بنا به دلایلی مثل حذف شدن یک مسیر یا موقتا از دسترس خارج شدم مسیر مورد نظر و ... آدرس یک مسیر را تغییر دهید که گزینه اول در این متد برای مسیر جدید و گزینه دوم مسیر قدیمی را تعیین می کند. بهتر است این کد را در فایل web.php وارد کنید گرچه می توان در جای دیگر نیز تعریف کرد ولی توصیه نمی گردد.

Route::redirect('/new', '/old');

برای انتقال دائمی Redirect لاراول

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

برای انتقال موقت Redirect لاراول

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

و اما برای بازگرداندن یک کد 301 (انتقال دائمی مسیر در لاراول) بهتر است از این کد استفاده کنید

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

 

مسیردهی ویوها در لاراول (View Routes)

برای مسیردهی مستقیم برای view ها در لاراول شما می توانید به صورت ساده تر و بدون استفاده از کنترلر یک view را نمایش دهید که آرگومان اول مسیر view مورد نظر خواهد بود (همان url) و آرگومان دوم نیز نام view می باشد همچنین شما می توانید با مقدار دهی آرگومان سوم داده هایی نیز برای view خود پاس دهید.

Route::view('/welcome', 'welcome');

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

پارامترهای مسیر یا Route Parameters

پارامترهای اجباری یا Required Parameters

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

حالت اجباری

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

حالت اجباری با چندین پارامتر ورودی

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

حالت اختیاری : با اضافه کردن علامت سوال ؟ به پارامتر مورد نظر حالت اجباری تبدیل به اختیاری خواهد شد به مثال توجه کنید.

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

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

محدود کردن و اعتبارسنجی پارامتر ها (Regular Expression Constraints)

شما می توانید در مسیردهی قالب پارامتر خود را تعیین کنید و از این طریق محدودیت های مورد نیاز را بدون نیاز به validation در خود تعیین مسیر انجام دهید به مثال های ذیل توجه کنید:

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]+']);

محدودیت های عمومی Global Constraints

برای ایجاد محدودیت عمومی در تمام مسیرها برای یک پارامتر مثل id شما می توانید الگوی محدودیت خود را در متد boot فایل RouteServiceProvider.php تعریف کنید.

public function boot()
{
    Route::pattern('id', '[0-9]+');

    parent::boot();       }

Encoded Forward Slashes

در مسیریابی لاراول تمام کاراکتر های به جز اسلش (/) امکان استفاده شدن دارند اما کاربر شاید احتیاج به جستجوی یک متن همراه با اسلش داشته باشد! لاراول در آخرین مسیر با وارد کردن شروطی بر مسیر اجازه استفاده از / را به شما خواهد داد. در مثال ذیل ما با علامت * اعلام کردیم پارامتر {search} هر نوع کاراکتری می تواند باشد.

Route::get('search/{search}', function ($search) {
    return $search;
})->where('search', '.*');

نام گذاری مسیرهای لاراول Named Routes

با نام گذاری مسیرها می توانید url راحتی تولید کنید که با متد name نام مورد نظر شما به مسیر مورد نظر نسبت داده خواهد شد. به مثال های ذیل توجه کنید

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

شما به مسیر بالا در دوحالت دسترسی خواهید داشت :

{{ url('user/profile') }} // به صورت عادی

{{ route('profile') }} // با نام اختصاص داده شده

 نام گذاری یک اکشن کنترلر 

Route::get('user/profile', 'UserProfileController@show')->name('profile');

آدرس اینترنتی مسیرهای نام گذاری شده لاراول

// Generating URLs...
$url = route('profile');

// Generating Redirects...return

redirect()->route('profile');

نام گذاری مسیرهای دارای پارمتر

گاهی اوقات شما یک مسیر که دارای پارامتر می باشد را نامگذاری می کنید که در این صورت پارامتر مسیر مورد نظر باید به عنوان آرگومان دوم در آدرس دهی مشخص شود.

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

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

اگر می خواهید تعیین کنید که آیا درخواست فعلی به مسیری به نام مشخص شده هدایت شده است یا تعیین کنید که دسترسی به این مسیر نامگذاری شده برای چه کسانی مجاز است و هزاران ایده دیگر برای کنترل کردن مسیرها در لاراول، می توانید از Inspecting The Current Route استفاده کنید

public function handle($request, Closure $next)
{
    if ($request->route()->named('profile')) {
        // اگر مسیر جاری مسیر نامگذاری شده پروفایل بود ...
    }

    return $next($request);     }

Laravel resource controller route

در کنترل هایی که به صورت resource تعریف کرده اید و مسیر دهی نیز به صورت resource باشد شما می توانید از url های دستی و هم نام گذاری شده برای دسترسی به اکشن مورد نظر خود استفاده کنید.

ساخت کنترلر 

php artisan make:controller PhotoController --resource

مسیردهی این کنترلر

Route::resource('photos', 'PhotoController');

گروه بندی مسیرها در لاراول

لاراول امکان گروه بندی مسیرهای مختلف را با تعیین خصوصیات مختلف دارد که شما را از نوشتن یک middlware مشترک برای تعداد زیادی مسیر مبرا می کند همچنین namespaces ، prefix  و ... که با Route::group شروع می شود 

Route::group(function() {

Route::get('/','Admin\AdminController@index');

Route::resource('Support','Admin\support\SupportController');

});

مثال گروه بندی  همراه با prefix

Route::group(['prefix' => 'Admin'], function() {    

Route::get('/','Admin\AdminController@index');    

Route::resource('Support','Admin\support\SupportController');

});

میدلور (Middleware) در مسیردهی لاراول

شما می توانید در یک گروه از مسیرها، middleware های مختلفی را اضافه کنید به دومثال میدل ور  (middleware) در Route Group توجه کنید

Route::middleware(['first', 'second'])->group(function () {
    Route::get('/', function () {
        // Uses first & second Middleware
    });

   Route::get('user/profile', function () {
        // Uses first & second Middleware
   });
});



Route::group(['prefix' => 'Admin','middleware' => ['auth','web','isadmin']], function() {    

Route::get('/','Admin\AdminController@index');   

Route::resource('Support','Admin\support\SupportController');     

});


مسیردهی با فضای نام Namespaces

Route::namespace('Admin')->group(function () {
    // Controllers Within The "App\Http\Controllers\Admin" Namespace
});

مسیردهی زیردامنه در لاراول Sub-Domain Routing

برای تعیین و ساخت sub domin های مختلف در لاراول به صورت گروه بندی شده نیز می توانید از Route Group استفاده کنید

Route::domain('{account}.myapp.com')->group(function () {
    Route::get('user/{id}', function ($account, $id) {
        //
    });
});

 

در لوکال هاست (localhost) برای تعیین sub domin نیز به این صورت عمل کنید

Route::domain('{account}.localhost')->group(function (){    

      Route::get('/','Domain\DomainController@index');    

      Route::get('/login',function (){

       return 'login';

     });

});

برای جلوگیری از اشتباه در مسیر های تکراری در sub domin ها و مسیر اصلی و جلوگیری از تداخل این دو مسیر با یکدیگر بهتر است مسیر دهی sub domain  بالاتر از تمام مسیرهای اصلی باشد.

 

پیشوند در مسیردهی لاراول Route Prefixes

prefix یا پیشوند در route ها در گروه بندی مسیرها به شما کمک می کند که جمعی از مسیرها که قسمتی از url یکسانی دارند را به صورت route prefix تعریف کنید مثلا ما 2 مسیر داریم که با Admin شروع می شوند پس یک گروه از این دو مسیر با پیشوند Admin ایجاد می کنیم

Route::prefix('admin')->group(function () {
    Route::get('users', function () {
        // Matches The "/admin/users" URL
    });
});

پیشوند نام در مسیردهی Route Name Prefixes

برای افزودن یک نام به ابتدای تمام مسیرها در گروه مسیرهای مورد نظر (نوع دیگری از پیشوند) با کاراکتر نقطه این عملیات را انجام دهید

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

استفاده از مدل در route لاراول Route Model Binding

در Route لاراول این امکان وجود دارد که مستقیما از یک مدل با شناسه ارسالی عملیات واکشی از دیتابیس را انجام دهید این کار از طریق تزریق مدل، بدون نیاز به تعریف مدل در بدنه function مسیر، می تواند انجام شود.

 

اتصال ضمنی Implicit Binding

لاراول به صورت اتوماتیک شناسه ارسالی در route مورد نظر را از مدل مربوطه (تزریق شده در متد مسیر) واکشی می کند مثال:

Route::get('api/users/{user}', function (App\User $user) {
    return $user->email;
});

در این مثال اگر شناسه ارسالی با هیچ رکوردی در جدول user مطالبقت نداشته باشد شما به صفحه 404 منتقل خواهید شد گزینه {user} همان شناسه کاربر می باشد. اگر شما بخواهید در این نوع مسیردهی به جای شناسه کاربر مثلا نام او را ارسال کنید باید در مدل user از طریق متد getRouteKeyName نوع واکشی از روی id را به نام ستون دلخواه خود تغییر دهید این مثال در داخل مدل مربوطه نوشته خواهد شد مثال ما مدل user می باشد:

public function getRouteKeyName()
{
    return 'family';
}

Fallback Routes مدیریت ارورهای 404 در لاارول

مدیریت ارورهای 404 در لاراول برای تمام وب سایت ها مورد نیاز می باشد از نسخه 5.6 لاراول گزینه fallback routes  به routing لاراول اضافه شده است شما می توانید این متد را در فایل web.php استفاده کنید این کد باید در بعد از تمام کدهای موجود در فایل web.php تعبیه گردید fallback routes تمام ارور های 404 ایجاد شده در سایت را به مسیر دلخواه شما هدایت میکند بیشترین کاربرد این گزینه زمانی گویا می باشد که شما تمام مسیرهای قبلی سایت را تغییر داده اید و کاربران از طریق موتورهای جستجو با انتخاب لینک قبلی شما وارد سایت می شوند پس شما می توانید یا به صورت کلی یا به صورت ایجاد یک پیشوند مسیرهای ارور داده را به مسیر دلخواه خود به صورت دائمی یا موقت انتقال دهید

Route::fallback(function () {
    //
});

مثال دوم Fallback Routes

Route::fallback(function () {     return \Illuminate\Support\Facades\Redirect::to('/home',301);   }); // انتقال دائم

Route::fallback(function () {     return \Illuminate\Support\Facades\Redirect::to('/home',302);   }); // انتقال موقت

مطالعه بیشتر: ارور 404

محدود کردن تعداد نرخ بازدید یک مسیر Rate Limiting لاراول

گاهی نیاز داریم تا تعداد درخواست برای هر کاربر روی یک یا تمام مسیرها را محدود کنیم مثلا هر دقیقه تا 60 درخواست فقط پشتیبانی شود این عملیات با middleware با نام throttle انجام می شود به صورت پیش فرض این middleware روی مسیرهای api اعمال می شود شما می توانید از طریق فایل kernel.php این تنظیمات را تغییر دهید یا با استفاده از middleware روی مسیر یا مسیرها اعمال کنید در مثال ذیل throttle ورودی اول تعداد درخواست و ورودی دوم دقیقه می باشد.

Route::middleware('auth:api', 'throttle:60,1')->group(function () {
    Route::get('/user', function () {
        //
    });
});

داینامیک کردن نرخ بازدید Dynamic Rate Limiting

در این نمونه شما باید گزینه ای در مدل user خود به نام rate_limit تعریف کنید تا لاراول به صورت اتوماتیک از مدل user این گزینه را دریافت کند.

Route::middleware('auth:api', 'throttle:rate_limit,1')->group(function () {
    Route::get('/user', function () {
        //
    });
});

گاهی نیاز است شما محدوده مجاز برای بازدیدکنندگان مهمان را علاوه بر کاربران لاگین کرده تعیین کنید Distinct Guest & Authenticated User Rate Limits

که در مثال ذیل عدد 10 تعداد درخواست مجاز کاربران مهمان می باشد عدد 60 برای کاربران لاگین کرده می باشد

Route::middleware('throttle:10|60,1')->group(function () {
    //
});

مثال بالا را می توانید به صورت داینامیک با تعریف rate_limit در مدل کاربر به صورت ذیل داشته باشید

Route::middleware('auth:api', 'throttle:10|rate_limit,1')->group(function () {
    Route::get('/user', function () {
        //
    });
});

 

ارسال متدهای DELETE , PUT , PATCH از طریق فرم در لاراول

فرم های html از عملکردهای get و post پشتیبانی می کنند و انواع مختلف دیگر مثل delete , put , patch را پشتیبانی نمی کند پس هنگام تعریف این متدها در فرم از _method  استفاده می کنید این گزینه نوع درخواست را تعیین خواهد کرد

 

همچنین می توانید از روش ذیل در bladeهای لاراول استفاده کنید

@method('PUT')
@csrf

متدهای دسترسی به مسیر فعلی Accessing The Current Route

با استفاده از متدهای ذیل می توانید به آدرس مسیر جاری ، نام مسیر جاری ، اکشن مسیر جاری دسترسی داشته باشید.

$route = Route::current();

$name = Route::currentRouteName();

$action = Route::currentRouteAction();

این مطلب با دوستان خود به اشتراک بگذارید همچنین سوالات خود را در بخش پرسش و پاسخ ثبت کنید

یادگیری: آموزش لاراول

بهزاد میرزازاده
مسیر درست با پرسش های درست ساخته می شود

مشاهده تمام مطالب نویسنده