Маршрути перевіряються в порядку реєстрації, і перемагає перший збіг.
Route::get('/posts/{post}', [PostController::class, 'show']);
Route::get('/posts/create', [PostController::class, 'create']); // ніколи не спрацює
Запит /posts/create збігається з першим маршрутом: create стає значенням {post}, прив'язка моделі не знаходить пост - 404.
Два способи виправити:
- Статичні маршрути - вище за параметризовані.
- Обмежити параметр, щоб він не ловив чуже:
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} саме з цієї причини. Проблема виникає, коли маршрути додають вручну в різних місцях файлу.
Докладніше в документації: Обмеження параметрів регулярними виразами