Версия для печати | оригинал записи

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

ash — Log-ово Хозяина

05 апреля 2019 19:06
Laravel. Фильтры маршрутов с регулярками
Laravel. Фильтры маршрутов с регулярными выражениями

[attachid=599257]

Совет дня.

В маршруте вы можете указать
Цитирую (PHP)
Route::get(‘projects/{project_id}’, ProjectController@show’);

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

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

Примеры из официальной документации Laravel
Цитирую (PHP)
// Только буквы
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]+']);

Другой пример — ограничение параметра одним или несколькими строго заданными значениями, без необходимости проверять его в Контроллере:
Цитирую (PHP)
Route::get('/user/{user_id}/{approve_action}','UserController@approve')
    ->where('approve_action', 'approve|decline');

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

Более того, вы можете указать, что имя определенной переменной всегда должно соответствовать определенному шаблону. Например нужно, чтобы project_id всегда был целым числом. Делаем в app/Providers/RouteServiceProvider.php:
Цитирую (PHP)
public function boot()
{
    Route::pattern('project_id', '[0-9]+');
    parent
::boot();
}



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

Комменты: 0


Demiart © 2019