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