Как исключить слаги из шаблона маршрута Laravel

У меня есть приложение Laravel Spark, и я хотел бы использовать первые два параметра в маршруте для команды и проекта с исключениями, такими как about_us, настройки, API и т. д.

Я настроил свои маршруты, похожие на:

Route::pattern('team', '[a-zA-Z0-9-]+');
Route::pattern('project', '[a-zA-Z0-9-]+');

Route::get('/home', 'HomeController@show');

Route::group(['prefix' => '{team}'], function () {
    Route::get('/', 'TeamController@dashboard');
    Route::group(['prefix' => '{project}'], function () {
        Route::get('/', 'ProjectController@dashboard');
        ...

//Spark defines routes such as /settings after the apps routing file is processed;
//thus I cannot route to /settings as it's caught by /{team}.

Я изо всех сил пытаюсь сделать одну из двух вещей. Либо исключите такие значения, как «api», «settings» и т. д., из шаблона {team}; или заставить маршруты Laravel Spark запускаться перед моими веб-маршрутами, чтобы я мог убедиться, что все допустимые маршруты проверяются перед сбором всех /{team}.

Любые идеи были бы хорошы!


person Kurucu    schedule 07.02.2017    source источник
comment
Просто сначала определите статические маршруты и поместите эту группу охвата всех в самый конец. Это идеальный подход, поскольку порядок маршрутизации имеет значение.   -  person Chris Cynarski    schedule 15.02.2017
comment
Привет, Крис, это был бы мой обычный подход, но, конечно, со Spark статические маршруты, которые определяет Spark, не находятся в вашем файле маршрутов web.php; они где-то в другом месте.   -  person Kurucu    schedule 15.02.2017


Ответы (3)


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

Если вы хотите продолжить этот путь, загляните в свой config.app.php, я считаю, что переключение между следующими двумя поставщиками вполне может достичь того, что вам нужно. Порядок конечного результата:

App\Providers\SparkServiceProvider::class, App\Providers\RouteServiceProvider::class,

Я использую последнюю версию Spark после недавней установки, теперь это значение по умолчанию, извините, если это отвлекающий маневр!

person davidsneal    schedule 14.02.2017
comment
На днях я попытался переключить их, и это не имело значения (что меня тоже удивило). Я попробую еще раз и отчитаюсь. - person Kurucu; 15.02.2017
comment
Попробуйте удалить кеш вашего поставщика услуг: bootstrap/cache/services.php - person Erik Berkun-Drevnig; 17.02.2017
comment
Я сделал, и это не имело никакого значения. - person Kurucu; 21.02.2017

Кажется, я решил это, используя следующий шаблон:

Route::pattern('team', '(?!^settings$)([a-zA-Z0-9-]+)');

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

В Spark есть несколько маршрутов, инкапсулированных в пакете Spark. Предпочитая не возиться с этим, позволяя, среди прочего, упростить обновление Spark позже, можно использовать шаблон маршрута, чтобы ограничить допустимые значения для вашего параметра. Таким образом, погуглив регулярные выражения, я, похоже, нашел шаблон, который будет исключать слаги, соответствующие моему параметру {team}.

Я считаю, что добавить больше исключений так же просто, как вставить оператор конвейера.

Это также, очевидно, будет работать на стандартных установках Laravel, но изменение порядка маршрутов, вероятно, будет лучшим первым вызовом.

person Kurucu    schedule 20.02.2017

Сначала вы должны определить маршруты, которые хотите исключить. Затем определите свои шаблоны под ними. Они будут иметь приоритет над шаблонами, потому что в Laravel маршруты оцениваются сверху вниз.

person EddyTheDove    schedule 07.02.2017
comment
Привет и спасибо за это. В Spark есть несколько предопределенных маршрутов (например, /settings), которых нет в файле веб-маршрутов — платформа вызывает их после файла маршрутов. Итак, мой вопрос касается либо использования шаблона для их исключения, либо знания того, как заставить фреймворк сначала запускать маршруты Spark. - person Kurucu; 08.02.2017