جداسازی فایلهای Route در لاراول

وقتی تعداد روتهای پروژهی ما زیاد بشن اینکه اونها رو توی فایلهای جدا نگهداری کنیم ایدهی خوبی میتونی باشه که اون رو توی این مقاله کوتاه یاد میگیریم.
سلام دوستان. احتمالا این مورد برای شما پیش اومده که مشغول توسعهی یک پروژه با فریمورک لاراول بودین و همینطور که پروژه بزرگتر شد، تعداد Route های اون هم به نسبت زیادتر شد. یکی از بزرگترین پروژههایی که برای لاراول که مشغول توسعهی اون هستم حدود ۲۵۰ تا روت داره با این حساب که بیشتر اونها Resource هستن! از این ۲۵۰ تا حدود نصف اونها برای قسمت مدیریت پروژه هست. یکی از بهترین کارهایی که میتونیم انجام بدیم تا پروژهی ما تمیزتر و خواناتر بشه، اینه که چیزهایی که به هم ربط ندارن رو جدا کنیم. یکی از اصول مهم توی طراحی نرمافزارها که پیشنهاد میکنم اون رو بخاطر بسپارین، اصل Separation of concerns هست که میگه:
بهتره که قسمتهایی از برنامه که ارتباطی به هم ندارن و متمایز هستن رو جداسازی و تفکیک کنیم.
هدف این اصل کپسولهسازی و ماژولار کردن برنامه هست.
توی مثال بالا چه چیزهایی به هم ربط ندارن؟ روتهای بخش مدیریت و روتهای بخش بیرونی وبسایت. توی این مقاله یاد میگیریم که چه جوری این کار رو خیلی تمیز و مرتب انجام بدیم 😉
ابتدا روتهای زیر رو درنظر بگیرید که مثلا همه توی فایل web.php قرار دارن:
// routes/web.php
Route::namespace('Front')->group(function () {
Route::get('/', 'HomeController@index');
Route::get('/posts', 'PostsController@index');
Route::get('/contact', 'ContactController@index');
Route::post('/contact', 'ContactController@submit');
});
Route::prefix('admin')->namespace('Admin')->group(function () {
Route::get('/', 'HomeController@index');
Route::resource('/posts', 'PostsController');
Route::resource('/users', 'PostsController');
});
همونطور که میبینید روتهای بخش Admin با روتهای بخش بیرونی سایت با هم توی یک فایل قرار دارن. وقتی تعداد روتها زیاد بشن یکی از مشکلاتی که به وجود میاد اینه که مدیریت، مرور و پیدا کردن روتها سخت میشه.
راه حل
خب برای اینکار فریمورک لاراول یک راه حل اختصاصی برای ما درنظر گرفته.
مرحله اول
اولین کاری که باید بکنیم اینه که برای هر بخش، یک فایل جدا درست کنیم. من برای بخش مدیریت یا Admin یک فایل به اسم admin.php توی مسیر /routes درست میکنم و همه روتهای بخش مدیریت رو به این فایل انتقال میدم:
<?php
Route::get('/', 'HomeController@index');
Route::resource('/posts', 'PostsController');
Route::resource('/users', 'PostsController');
دقت کنین که من prefix و namespace رو از این قسمت حذف کردم. توی مرحله بعد اونها رو اضافه خواهیم کرد.
مرحله دوم
فایل RouteServiceProvider.php که توی مسیر app/Providers هست رو باز میکنیم. این فایل که شامل یک کلاس هست، یک متد داره به اسم map که محتویات اون اینطوریه:
public function map()
{
$this->mapApiRoutes();
$this->mapWebRoutes();
//
}
داخل این متد، دو متد دیگه دارن فراخونی میشن. mapApiRoutes و mapWebRoutes که این متدها توی همین کلاس وجود دارن که میتونین انتهای کلاس اونها رو ببینین. همونطور که میدونیم لاراول بطور پیشفرض مسیرهای web و api رو بصورت فایل از هم جدا کرده. چیزی که جالبه بدونیم اینه که این فایلها همینجا و توی متد map رجیستر شدن! خب ما هم باید همین کار رو کنیم. توی همین کلاس، یک متد به اسم adminWebRoutes درست میکنیم که من محتویات اون رو از متد mapWebRoutes کپی میکنم و یکم اون رو بر اساس نیازمون تغییر میدم:
<?php
namespace App\Providers;
// ...
class RouteServiceProvider extends ServiceProvider
{
// ...
protected function mapAdminRoutes()
{
Route::middleware('web')
->name('admin.')
->prefix('admin')
->namespace($this->namespace . '\Admin')
->group(base_path('routes/admin.php'));
}
}
همونطور که میبینیم توی این قسمت هم میشه از متدهای name و prefix و هر چیزی که قبلا توی فایلهای روت استفاده میکردیم اینجا هم استفاده کنیم.
مرحله سوم
خب آخرین کاری که باید انجام بدیم اینه که این متد رو توی متد map فراخونی کنیم:
public function map()
{
$this->mapApiRoutes();
$this->mapWebRoutes();
$this->mapAdminRoutes();
}
خب به همین سادگی! الان همهی مسیرهایی که توی فایل admin.php تعریف شده، توسط لاراول شناسایی شدن :)
خب دوستان این مقاله هم به پایان رسید که امیدوارم ازش استفاده کرده باشین. اون رو به اشتراک بذارین و منتظر نظراتتون هم هستم. روزتون خوش 😉 ✌️👌
من برای این مقاله از اطلاعات شخصی و منبع زیر استفاده کردم:
واکنش شما به این پست؟
درباره نویسنده
