Можно ли в Laravel настроить маршруты так, чтобы один URL мог содержать как статические, так и динамические параметры?

Как можно обойти текущее поведение маршрутов, чтобы исключить статические маршруты без использования дополнительных контроллеров?
  • 7 января 2024 г. 9:17
Ответы на вопрос 2
В Laravel маршруты могут содержать как статические, так и динамические сегменты одновременно. Динамические сегменты представлены переменными в фигурных скобках `{}`, а статические сегменты — это обычный текст в URL.

Пример маршрута с и статическими, и динамическими параметрами:

```php
Route::get('/products/{category}/{id}', function ($category, $id) {
    // $category и $id будут динамическими параметрами, а /products/ - статическим сегментом URL
});
```

Если требуется исключить статические маршруты, при этом не создавая дополнительных контроллеров, можно использовать регулярные выражения для ограничения параметров маршрута. Например:

```php
Route::get('/products/{name}', function ($name) {
    // Обрабатывает маршруты, где name - это не "categories" и не "sales"
})->where('name', '^(?!categories|sales).*$');
```

Представленный выше маршрут будет сопоставлен с любым URL, начинающимся с `/products/`, и продолжающимся любым текстом, кроме слов `categories` и `sales`.

Если требуется исключить некоторые статические маршруты, то можно сначала определить маршруты, которые необходимо "заблокировать", и уже после них добавлять более общий маршрут:

```php
// Статические маршруты, которые будут исключены
Route::get('/products/categories', 'CategoriesController@index');
Route::get('/products/sales', 'SalesController@index');

// Общий маршрут, который не будет применяться к URL выше
Route::get('/products/{name}', function ($name) {
    // Если URL не соответствует статическим маршрутам, управление переходит сюда
});
```

Также можно использовать именованные группы маршрутов для удобства:

```php
Route::prefix('products')->group(function () {
    Route::get('/categories', 'CategoriesController@index');
    Route::get('/sales', 'SalesController@index');

    Route::get('/{name}', function ($name) {
        // Обработка динамического маршрута
    })->where('name', '^(?!categories|sales).*$');
});
```

Таким образом, можно довольно гибко управлять статическими и динамическими частями маршрутов в Laravel, используя регулярные выражения для ограничения динамических сегментов и последовательностью определения маршрутов для того, чтобы отдавать приоритет статическим маршрутам.
Можно.  Во-первых порядок имеет значение, выбирается первый подходящий роут. Во-вторых, у новых версий Лары есть возможность задать отдельный обработчик для незаданных роутов https://laravel.com/docs/10.x/routing#fallback-routes (правда там slug не передается в метод, но эти данные можно получить другим путем). 

Тот пример что ты выше привел должен работать корректно.
Похожие вопросы