Laravel. Фильтры маршрутов с регулярными выражениями

Laravel. Фильтры маршрутов с регулярными выражениями

Совет дня.

В маршруте вы можете указать

Route::get(‘projects/{project_id}’, ‘ProjectController@show’);

А если нужно, чтобы project_id был строго целым числом?

Для этого нужно поместить в Route условие where() и использовать регулярное выражение с указанием нужного шаблона.

Примеры из официальной документации Laravel

// Только буквы
Route::get('user/{name}', function ($name) {
    //
})->where('name', '[A-Za-z]+');

// Только цифры
Route::get('user/{id}', function ($id) {
    //
})->where('id', '[0-9]+');

// Несколько параметров и шаблонов
Route::get('user/{id}/{name}', function ($id, $name) {
    //
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);

 

Другой пример — ограничение параметра одним или несколькими строго заданными значениями, без необходимости проверять его в Контроллере:

Route::get('/user/{user_id}/{approve_action}','UserController@approve')
    ->where('approve_action', 'approve|decline');

Если вы укажете эти условия, то маршрут будет соответствовать, только тем, что находятся в регулярке, поэтому, если вы введете адрес просто /user/123, то отобразится страница 404.

Более того, вы можете указать, что имя определенной переменной всегда должно соответствовать определенному шаблону. Например нужно, чтобы project_id всегда был целым числом. Делаем в app/Providers/RouteServiceProvider.php:

public function boot()
{
    Route::pattern('project_id', '[0-9]+');
    parent::boot();
}

 

Автор: Povilas Korop
Перевод: Demiurge Ash