آموزش مسیریابی در لاراول یا Routing in laravel

دسته بندی: لاراول
سطح مقاله: پیشرفته
زمان مطالعه: 16 دقیقه
۲۵ تیر ۱۳۹۹

در برنامه نویسی، زمانی که از الگوی معماری MVC استفاده می‌کنیم، Router یا مسیریاب وظیفه‌ی تعیین مسیر مناسب برای درخواست‌های ارسالی به برنامه را به عهده دارد. درخواست‌ها یا Request‌‌های کاربران، ابتدا به بخش Router برنامه فرستاده می‌شوند، سپس با توجه به Route تعریف شده به مسیری دلخواه می‌روند. URL ،Router یا مسیری را که کاربر درخواست کرده بود را با Route‌های تعریف شده مقایسه می‌کند، و در صورتی که URL درخواستی در لیست Route‌های تعریف شده وجود داشته باشد، Router درخواست کاربر را به قسمت‌های محتلف برنامه که تعریف کردیم، ارسال می‌کند، و در صورت وجود آن قسمت‌ها، درخواست ما به درستی اجرا می‌شود. اگر هنوز به درستی با مفاهیم Route‌ها و Routing در لاراول ارتباط برقرار نکرده‌اید، پس در ادامه توجه بیشتری به Method‌های مختلف آن، که مکانیسمی شبیه به هم دارند، داشته باشید.

فرض کنید یک گارسون در رستوران سفارش مشتریان را از پیشخوان آشپزخانه تحویل می‌گیرد. حال وظیفه اوست که هر سفارش را به میز مورد نظر ببرد. در این‌جا سفارش مشتریان همان Request‌ها و گارسون همان Route است.

waiter

فهرست محتوای این مقاله

ساختار Route ها

ساختار Route‌ها در لاراول بسیار ساده است. برای ساخت یک روت برای وب سایت کافی است، فایل web.php را باز کنید، و با استفاده از ::Route شروع به ساخت Route جدید کنید. سپس باید نوع درخواستی که Route می‌تواند، دریافت کند، که به آن‌ها Verbs‌های Http می‌گویند، را در روبروی آن وارد کنید.

Route‌ها می‌توانند این Verb‌ها را بپذیرند :

  • Get
  • Post
  • Put
  • Delete
  • Patch
  • Options

در پایان، تابعی که می‌خواهید با دریافت درخواست از URL، فراخوانی شود، را ایجاد می‌کنید.

مثلا در کد پایین ما یک Route به مسیر https://7learn.com/about ایجاد کرده ایم:

Route::get('/about', function() {
    echo "About Us";
});

در این کد ما یک Route برای آدرس https://7learn.com/about تعریف کردیم، تا هنگامی که یک کاربر به این مسیر آمد، توسط دستور echo، متن About Us را برای آن نمایش دهیم. البته برای تعریف Action یا عکس‌العمل Route می‌توانیم به جای استفاده از تابع Callback، یک Controller را فراخوانی کنیم. به‌طور مثال فرض کنید یک Controller به‌نام PageController ساخته‌ایم، و متدی به ‌نام showAbout را در آن تعریف کرده‌ایم. حال در این‌صورت می‌توانیم، Route بالا را به شکل زیر بازنویسی کنیم، تا متد showAbout نقش نمایش دهنده‌ی اطلاعات، را در آن ایفا کند.

Route::get('/about', '[email protected]');

حال فرض کنید که می‌خواهید برای Route شما علاوه ‌بر یک Verb مانندPOST، یک Verb دیگر مانند GET نیز تعریف شده باشد. برای این‌کار از متد match استفاده می‌کنیم.

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

هم‌چنین اگر بخواهید تمام Verb‌ها برای یک Route تعریف شده باشد، از متد any می‌توانید استفاده کنید.

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

CSRF Tokens

برای ارسال درخواست‌های HTTP از نوع POST ,PATCH ,DELETE و PUT باید حتما یک توکن CSRF، مانند دستور زیر به سمت Route ارسال کنید.

<form method="POST" action="/profile">
    @csrf
    ...
</form>

برای دیدن اطلاعات بیشتر در مورد توکن‌های CSRF می‌توانید به مستندات لاراول مراجعه کنید.

Redirect کردن Route ها

اگر بخواهید یک Route را به یک URL ارسال یا Redirect کنید، می‌توانید از متد redirect استفاده کنید.

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

مشاهده‌ی صفحات مختلف وب سایت با استفاده از Route

گاهی اوقات می‌خواهیم هنگامی که یک Route اجرا می‌شود، یک View برای ما به نمایش در بیاید. برای این‌ کار از متد View، که مکانیسمی شبیه به redirect دارد، استفاده می‌کنیم.

این متد به عنوان آرگومان اول یک Url و به عنوان آرگومان دوم یک blade یا همان View را می‌پذیرد.

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

در کد بالا فایل welcome.blade.php اجرا می‌شود.

ارسال پارامتر با استفاده از Route

فرض کنید، می‌خواهید کاربران از طریق یک راهی، پارامتری را به URL چسبانده و اطلاعاتی را متناسب با آن دریافت کنند. فریم ورک لاراول راهی را برای انجام این کار در اختیار شما قرار می‌دهد. برای ارسال پارامتر می‌توانید به راحتی نام آن را به صورت {name} به URL بچسبانید. به مثال زیر دقت کنید:

Route::get('/articles/{id}', function($id) {
    echo $id;
});

در کد بالا یک پارامتر را به روت چسبانده‌ایم که به آن Route Parameter می‌گوییم. از این لحظه به بعد، هر کاربری که یک پارامتر را به عنوان درخواست به مسیر https://7learn.com/articles/ الحاق کند، می‌تواند آن عدد را مشاهده کند. به عنوان مثال اگر مسیر https://7learn.com/articles/2 را وارد کنید، عدد 2 نمایش داده می‌شود.

اما اگر بیشتر از یک پارامتر داشته باشیم، پارامترها به ترتیب چیدمان به عنوان آرگومان به تابع Action ارسال می‌شوند. به این مثال توجه کنید:

Route::get('/blog/{category}/{slug}', function($category , $slug) {
    // Write your code here
});

در این مثال به ترتیب قرارگیری پارامترها، آرگومان‌ها ارسال می‌شوند. به عنوان نمونه در مسیر https://7learn.com/blog/laravel/laravel-routes پارامتر اول در نقش category و پارامتر دوم در نقش slug است.

فریم ورک لاراول امکانی را فراهم می‌سازد، که با استفاده از آن می‌توانید، ارسال پارامتر را به یک URL، اختیاری یا Optional کنید. برای این‌ کار کافی است، یک علامت ? در کنار نام پارامتر بنویسید. البته فراموش نکنید در تابع اکشن حتما برای پارامترهای اختیاری مقدار پیش‌فرض در نظر بگیرید. در مثال زیر پارامتر slug را به صورت اختیاری در نظر گرفته ایم:

Route::get('/blog/{category}/{slug?}', function($category , $slug = null) {
    // Write your code here
});

گروه بندی Route

هنگام استفاده از فریم ورک Laravel می‌توانیم، به جای آن که یک سری از ویژگی‌ها یا attribute‌‌های یکسان را بارها و به تکرار به چند Route نسبت دهیم، از قابلیت Route‌های گروه بندی شده یا همان Route Groups استفاده کنیم. Route‌های گروه بندی شده به شما این امکان را می‌دهند، که به جای تکرار این attribute ها، آن‌ها را به یک Route::group نسبت دهید. در این روش attribute‌های مشترک در فرمت یک آرایه به شکل یک پارامتر به متد Route::group داده می‌شوند. در ادامه‌ی آموزش Routing در لاراول ، بعضی از attribute‌های قابل اشتراک در این نوع Route‌ها را به شما معرفی می‌کنیم.

اشتراک در Middleware

برای نسبت دادن یک Middleware به گروهی از Route‌ها از متد middleware قبل از تعریف گروه استفاده می‌کنیم. این Middleware‌‌ها به ترتیبی که در آرایه نوشته شده اند روی روت‌ها اعمال می‌شوند. به مثال زیر توجه کنید:

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

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

اشتراک در Namespace

یکی دیگر از کاربردهای مهم Route ‌های گروهی نسبت دادن یک Namespace به گروهی از Controller‌ها است. برای انجام این کار از متد namespace به این صورت استفاده می‌کنیم:

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

البته برای Routing در لاراول ، Namespace تمام Controller‌های Route ها، به‌صورت پیش‌فرض App\Http\Controllers فرض شده است. به همین دلیل احتیاج نیست در متد namespace، نام کامل آن را که در این مثال App\Http\Controllers\Admin است، وارد کنید. یعنی لازم نیست بخش App\Http\Controllers را در ابتدای Namespace وارد کنید و Admin به تنهایی کافی است.

اشتراک در زیر دامنه 

Route Group‌ها می‌توانند برای استفاده‌ی اشتراکی از یک زیر دامنه یا Sub-domain هم استفاده شوند. این زیردامنه‌ها به شما اجازه می‌دهند که بخشی از دامنه را برای استفاده در Route خود شخصی سازی کنید. برای مشخص کردن زیر‌ دامنه می‌توانید از متد domain قبل از ایجاد گروه به این صورت استفاده کنید:

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

اشتراک در Prefix

با استفاده از متد prefix می‌توانید بخشی از URL را به عنوان پیشوند به همه Route هایی که عضو Route Group هستند، نسبت بدهید. به این ترتیب دیگر احتیاجی به تکرار آن تکه از URL در همه Route‌ها نیست. به عنوان مثال در کد زیر تمام Route هایی که زیر گروه admin هستند، را در یک گروه قرار داده‌ایم:

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

استفاده از عبارات منظم در Route ها

در مثال‌های بالا به‌طور مثال یک پارامتر id برای مقاله‌ها در نظر گرفتیم، که در حالت عادی این id با id رکوردهای جدول مقاله‌ها در Database مقایسه شده و مقاله‌ای که شماره id آن با شماره پارامتری که وارد کردیم برابر بود، نمایش داده می‌شود. اما چه اتفاقی می‌افتد اگر کاربر به اشتباه مقدار این پارامتر را به حروف وارد کند؟

همان‌طور که می‌بینید باید دنبال راهی باشیم که بتوانیم فقط پارامترهای با فرمت دلخواه‌مان را بپذیریم. این کار در لاراول با استفاده از متد where و عبارات منظم یا Regular Expressions بر روی Route‌ها امکان پذیر است. به این صورت که نام پارامتر را به عنوان آرگومان اول و عبارت منظم مورد نظرمان را به عنوان آرگومان دوم به متد where می‌دهیم. به مثال زیر توجه کنید :

Route::get('/articles/{id?}', function ($id = 2) {
    // Write your code here
 })->where('id', '[0-9]+');

مثال‌های بیشتر :

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

در کد بالا یک عبارت منظم را برای پارامتر id تعریف کرده‌ایم. از این به بعد هر وقت کاربری سعی کند، یک مقدار غیر عددی را به عنوان پارامتر id به همراه URL ارسال کند، یک خطای NotFoundException به او نمایش داده خواهد شد.

نام گذاری Route ها 

برای Routing در لاراول ، هنگامی که Route‌ها را نام‌گذاری می‌کنیم، می‌توانیم به راحتی آن‌ها را در هر صفحه‌ای فراخوانی کنیم. برای تعریف یک نام مشخص برای Route مورد نظر از متد name استفاده می‌کنیم.

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

Route::get('user/profile', '[email protected]')->name('profile');

هم‌چنین برای فراخوانی آن‌ها از متد route استفاده می‌کنیم.

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

// Generating Redirects...
return redirect()->route('profile');

محدود سازی دسترسی به Route ها

گاهی اوقات می‌خواهید یک محدوده‌ای برای دسترسی به Route‌ها تعیین کنید. برای این‌ کار از یک Middleware به‌نام throttle استفاده می‌کنیم.

throttle می‌تواند دو آرگومان که تعداد مجاز درخواست‌ها در یک زمان را تعیین می‌کند، را به شکل زیر بپذیرد.

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

توسط کد بالا، کاربران تایید‌شده حداکثر می‌توانند ۶۰ بار در دقیقه به Route‌ها دسترسی پیدا کنند.

جمع‌بندی:

همان‌طور که در این مقاله مشاهده کردید، ایجاد Route‌ها در ابتدا کاری تقریبا ساده است اما تمایز میان شما و دیگر برنامه نویسان همین نکات ریز و درشت مسیریابی و Routing است، که در این مقاله با زبانی بسیار ساده به توضیح آن‌ها پرداختیم. یادگیری هر چه بهتر این نکات بستگی به تمرین و تکرار شما دارد. اگر درباره‌ی انواع Route‌ها یا نحوه  Routing در لاراول هر گونه سوالی دارید، از طریق نظرات با ما در میان بگذارید تا در اسرع وقت به پاسخ خود دست پیدا کنید.

اگر به یادگیری بیشتر لاراول علاقه دارید می‌توانید در دوره آموزشی لاراول کاربردی (بسته پروژه محور) شرکت کنید، این دوره شامل ۱۲ پروژه کاربردی و پر استفاده در دنیای واقعی است، که تمامی پروژه‌ها به صورت کامل برنامه‌ نویسی خواهند شد، تا دانشجو بتواند با روند ایجاد و تکمیل پروژه به صورت کامل آشنا شود.

 

چه امتیازی به این مقاله می دید؟
نویسنده علی مجیدی
Backend Developer | PHP & Laravel Developer

نظرات کاربران

اولین دیدگاه این پست رو تو بنویس !

ارسال دیدگاه
خوشحال میشیم دیدگاه و یا تجربیات خودتون رو با ما در میون بذارید :