Когда ваши файлы маршрутов становятся такими большими, это затрудняет их обслуживание.
Однажды я решил сделать пример проекта с множеством маршрутов. В моем web.php файле быстро появились трещины. Как почти 1000 строк объявления маршрутов даже с некоторыми помощниками. Пока я не обнаружил два простых решения.
1. Вызов других файлов
Я думаю, что некоторые мастера PHP убьют меня за то, что я собираюсь сделать, но, тем не менее, это работает: просто вызовите другой файл PHP.
// routes/web.php
Route::get('user')
->uses('UserController@user');
Route::prefix('podcasts')
->name('podcasts')
->group(__DIR__ . '/podcasts.php');
То, что я сделал в последней строке кода, выделенной жирным шрифтом, было просто. Я вызываю другой файл PHP внутри метода group(). Внутри этого файла мы поместим маршруты в эту группу, которая будет вести себя так, как если бы они находились внутри анонимной функции.
Вы также можете использовать base_path('routes/podcasts.php'). Поскольку маршруты должны кэшироваться в производственных средах, разница только в разработке, поскольку они создаются на ходу.
2. Используйте собственный генератор маршрутов.
Это менее простой, но более автоматизированный процесс, поэтому вам не нужно тратить время на повторное объявление своих маршрутов.
Мы создадим класс с именем RoutesGenerator и добавим методы, которые будут динамически регистрировать маршруты. Они могут иметь некоторую конфигурацию на основе аргументов метода. Мы можем просто полениться и использовать Фасад в реальном времени для вызова его внутри этого файла, но в моем случае я буду использовать только статическую функцию, которую я считаю более простой.
<?php
namespace App\Http;
class RoutesGenerator
{
public static function byGenres(array $genres)
{
foreach($genres as $genre) {
Route::get($genre)
->uses('GenresController@get' . ucfirst($genre));
}
}
}
Затем мы вызываем метод в файле маршрутов.
// routes/web.php
Route::get('user')
->uses('UserController@user');
$genres = [
'entertainment', 'games', 'music', 'comedy', 'drama'
];
Route::prefix('podcasts')
->name('podcasts')
->group(App\Http\RoutesGenerator::byGenres($genres));
Это почти все, что вы можете сделать, чтобы сократить свои маршруты. У них также не должно быть проблем с их кешированием, если в них нет замыкания.