Организация маршрутов в отдельных файлах

Организация маршрутов в отдельные файлы

Я расскажу вам об основных рекомендациях по организации файлов маршрутов, что бы вы не забывали что и где находится.

Простые приложения могут использовать файлы routes/web.php или routes/api.php для описания своих маршрутов. Поскольку они небольшие, то писать-то им особо и нечего.

В других приложениях может быть и полсотни и больше сотни маршрутов. Вместо того, чтобы продолжать набивать их в один файл, можно организовать свои маршруты в отдельные файлы.

Просто добавьте еще один файл

Перейдите в App/Providers/RouteServiceProvider и найдите метод map(). Здесь сервис-провайдер составляет карту ваших маршрутов. Смотрите — API и Web маршруты обрабатываются другими методами.

Вы можете просто скопипастить код в mapWebRoutes() и изменить файл группы на тот, который вам нужен:

/**
* Определение маршрутов для приложения.
*
* @return void
*/
public function map()
{
$this->mapApiRoutes();
$this->mapWebRoutes();
Route::middleware('web')
->namespace($this->namespace)
->group(base_path('routes/my-custom-routes.php'));
}
/** * Определение маршрутов для приложения. * * @return void */ public function map() { $this->mapApiRoutes(); $this->mapWebRoutes(); Route::middleware('web') ->namespace($this->namespace) ->group(base_path('routes/my-custom-routes.php')); }
/**
 * Определение маршрутов для приложения.
 *
 * @return void
 */
public function map()
{
    $this->mapApiRoutes();
    $this->mapWebRoutes();    
    
    Route::middleware('web')
        ->namespace($this->namespace)
        ->group(base_path('routes/my-custom-routes.php'));
}

Приложение обработает маршруты API, веб-маршруты и, наконец, ваши кастомные маршруты.

Группы и файлы

Фасад маршрутов позволяет создать группу маршрутов через замыкание, возвращающее больше маршрутов, но, как вы видели ранее, фреймворк начинает с вызова файла.

В ваших маршрутных файлах вы можете использовать такую же технику. Вместо использования замыкания, вы можете просто указать на другой файл, что эффективно уменьшит размер файл маршрута.

Route::name('dashboard')
->prefix('dashboard')
->namespace('Dashboard')
->middleware(['auth','verified'])
->group(__DIR__ . '/web/dashboard.php');
Route::name('dashboard') ->prefix('dashboard') ->namespace('Dashboard') ->middleware(['auth','verified']) ->group(__DIR__ . '/web/dashboard.php');
Route::name('dashboard')
    ->prefix('dashboard')
    ->namespace('Dashboard')
    ->middleware(['auth','verified'])
    ->group(__DIR__ . '/web/dashboard.php');

Затем мы можем создать файл routes/web/dashboard.php, содержащий маршруты для нашей панели инструментов. Мы также применяем кастомное пространство имен, префикс и мидлвар для всех маршрутов и добавляем имя.

Мы можем вложить группы в группу, чтобы держать их в одном файле. Без проблем:

// routes/web/dashboard.php
Route::get('/', 'HomeController');
Route::get('/account', 'AccountController@show');
Route::post('/account', 'AccountController@update');
Route::name('users')
->prefix('users')
->namespace('Users')
->middleware('can:manage-users')
->group(__DIR__ . '/dashboard/users.php');
Route::name('delivery')
->prefix('delivery')
->namespace('Delivery')
->middleware('can:manage-delivery')
->group(__DIR__ . 'dashboard/delivery.php');
// routes/web/dashboard.php Route::get('/', 'HomeController'); Route::get('/account', 'AccountController@show'); Route::post('/account', 'AccountController@update'); Route::name('users') ->prefix('users') ->namespace('Users') ->middleware('can:manage-users') ->group(__DIR__ . '/dashboard/users.php'); Route::name('delivery') ->prefix('delivery') ->namespace('Delivery') ->middleware('can:manage-delivery') ->group(__DIR__ . 'dashboard/delivery.php');
// routes/web/dashboard.php

Route::get('/', 'HomeController');
Route::get('/account', 'AccountController@show');
Route::post('/account', 'AccountController@update');

Route::name('users')
    ->prefix('users')
    ->namespace('Users')
    ->middleware('can:manage-users')
    ->group(__DIR__ . '/dashboard/users.php');
    
Route::name('delivery')
    ->prefix('delivery')
    ->namespace('Delivery')
    ->middleware('can:manage-delivery')
    ->group(__DIR__ . 'dashboard/delivery.php');

Простая группа

Иногда нет необходимости помещать имена, префиксы, пространства имен и мидлвары в группу. Вы можете просто создать группу, поместить внутрь все маршруты и управлять нужными параметрами для каждого конкретного случая. Случайный пример:

// routes/web.php
Route::group(__DIR__ . '/web/message.php');
// routes/web/message.php
Route::get('client/send', 'MessageController@clientShow');
Route::post('client/send', 'MessageController@clientSend');
Route::get('courier/send', 'MessageController@courierShow')
->middleware('can:send-message-to-courier');
Route::get('courier/send', 'MessageController@courierShow')
->middleware('can:send-message-to-courier');
// routes/web.php Route::group(__DIR__ . '/web/message.php'); // routes/web/message.php Route::get('client/send', 'MessageController@clientShow'); Route::post('client/send', 'MessageController@clientSend'); Route::get('courier/send', 'MessageController@courierShow') ->middleware('can:send-message-to-courier'); Route::get('courier/send', 'MessageController@courierShow') ->middleware('can:send-message-to-courier');
// routes/web.php

Route::group(__DIR__ . '/web/message.php');

// routes/web/message.php

Route::get('client/send', 'MessageController@clientShow');
Route::post('client/send', 'MessageController@clientSend');
Route::get('courier/send', 'MessageController@courierShow')
    ->middleware('can:send-message-to-courier');
Route::get('courier/send', 'MessageController@courierShow')
    ->middleware('can:send-message-to-courier');

Привязываем Модель к Маршруту как префикс

Еще одна вещь, которую вы можете сделать — привязать модель к маршруту как префикс , чтобы все дочерние маршруты имели одинаковую привязку.

// routes/web.php
Route::prefix('{delivery}')->group(__DIR__ . '/web/delivery.php');
// routes/web/delivery.php
Route::get('/', 'DeliveryController@show');
Route::get('/routes', 'DeliveryController@routes');
Route::get('/products', 'DeliveryController@products');
Route::get('/drivers', 'DriverController@deliveryDriver');
// routes/web.php Route::prefix('{delivery}')->group(__DIR__ . '/web/delivery.php'); // routes/web/delivery.php Route::get('/', 'DeliveryController@show'); Route::get('/routes', 'DeliveryController@routes'); Route::get('/products', 'DeliveryController@products'); Route::get('/drivers', 'DriverController@deliveryDriver');
// routes/web.php

Route::prefix('{delivery}')->group(__DIR__ . '/web/delivery.php');

// routes/web/delivery.php

Route::get('/', 'DeliveryController@show');
Route::get('/routes', 'DeliveryController@routes');
Route::get('/products', 'DeliveryController@products');
Route::get('/drivers', 'DriverController@deliveryDriver');

Так что нет необходимости возводить стены маршрутов в одном файл и надеяться, что вам не понадобится карта для поиска того самого именного маршрута, который мешает другому.

Автор: Italo Baeza
Перевод: Алексей Широков

Наш Телеграм-канал — следите за новостями о Laravel.