Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама

Чому порядок маршрутів має значення і як обмежувати параметри?

Маршрути перевіряються в порядку реєстрації, і перемагає перший збіг.

Route::get('/posts/{post}', [PostController::class, 'show']);
Route::get('/posts/create', [PostController::class, 'create']); // ніколи не спрацює

Запит /posts/create збігається з першим маршрутом: create стає значенням {post}, прив'язка моделі не знаходить пост - 404.

Два способи виправити:

  1. Статичні маршрути - вище за параметризовані.
  2. Обмежити параметр, щоб він не ловив чуже:
Route::get('/posts/{post}', [PostController::class, 'show'])->whereNumber('post');
Route::get('/users/{name}', ...)->whereAlpha('name');
Route::get('/orders/{order}', ...)->whereUuid('order');
Route::get('/category/{type}', ...)->whereIn('type', ['news', 'guides']);

Глобальне обмеження для всіх маршрутів з параметром {id}:

// AppServiceProvider::boot()
Route::pattern('id', '[0-9]+');

Route::resource() реєструє create раніше за {post} саме з цієї причини. Проблема виникає, коли маршрути додають вручну в різних місцях файлу.

Докладніше в документації: Обмеження параметрів регулярними виразами

Перевір себе

20 випадкових питань за спробу, після завершення - розбір кожної помилки

Схожі питання