О web-разработке
и даже немного больше...

Как вывести роуты Laravel в отдельный файл?

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

Создаём отдельный файл маршрутов

Для начала давайте создадим новый файл, в который следует перенести нужные вам маршруты. Создадим для этих целей отдельный файл в папке /routes, назовём его redirects.php. Называть файл можно и по-другому, важно только учесть его имя при подключении его.
Подключается следующим образом, переходим в файл /App/Providers/RouteServiceProvider.php, в нём находим метод map(). Далее дописываем код для подключения файла:

    public function map()
    {
        $this->mapApiRoutes();

        // redirects for old links
        Route::middleware('web')
                ->namespace($this->namespace)
                ->group(base_path('routes/redirects.php'));

        $this->mapWebRoutes();
    }

Таким образом, будет подключён файл /routes/redirects.php, между вызовами методов mapApiRoutes() и mapWebRoutes(). В случае необходимости можно менять порядок обращения к файлу.

Обращение к группе маршрутов

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

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.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');

Такой способ так же имеет право на жизнь, и в какой-то степени упрощает понимание и поиск нужного маршрута в файлах. Что так же может избавить от проблем с конфликтами маршрутов.

Опубликован: 07.01.2023 г.

См. также:

Ограничение параметров в маршрутах Laravel
Необязательные параметры маршрутов в Laravel
Как выбрать записи за определённый период (День, Месяц, Год) в Laravel?
Использование метода leftJoin() для выборки из нескольких таблиц в Laravel
Как просмотреть SQL запрос в Eloquent Laravel?
Как объявить переменную в шаблоне Laravel Blade?
Проверка на пустоту коллекций Eloquent в Laravel
Как получить URL текущей страницы в Laravel?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Комментарии
  • Загрузка...
Друзья сайта