Известно, что в простых приложениях для организации маршрутов (роутов в быту) бывает достаточно использования одно файла маршрутов /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');
Такой способ так же имеет право на жизнь, и в какой-то степени упрощает понимание и поиск нужного маршрута в файлах. Что так же может избавить от проблем с конфликтами маршрутов.