#php #laravel #routes #http-status-code-404
#php #laravel #маршруты #http-status-code-404
Вопрос:
Я использую Laravel 8 и явную привязку режима маршрута в моем проекте для вызова продукта под slug
вместо id
. У меня есть продукты, сообщения и т. Д., Которые Все используют явную привязку режима маршрута к slug
в базе данных вместо id
.
Что меня действительно смущает, так это то, что явная привязка режима маршрута работает везде, но не с products
. Вот мой RouteServiceProvider:
// Change route for product from $id to $slug
Route::bind('product', function ($value) {
return Product::where('slug', $value)->first() ?? abort(404);
});
// Change route for user from $id to $name
Route::bind('user', function ($value) {
return User::where('name', $value)->first() ?? abort(404);
});
// Change route for product from $id to $slug
Route::bind('post', function ($value) {
return Post::where('slug', $value)->first() ?? abort(404);
});
Вот несколько примеров routes
для a user
, a product
и a post
:
works: Route::get('/product/{productType}/{product}', ['as' => 'product.show', 'uses' => 'ProductController@show']);
404 error: Route::post('product/{product}/like', ['as' => 'product.like', 'uses' => 'LikeController@likeProduct']);
404 error: Route::post('product/{product}/dislike', ['as' => 'product.dislike', 'uses' => 'LikeController@dislikeProduct']);
404 error: Route::post('product/{product}/mark', ['as' => 'product.mark', 'uses' => 'ProductController@markProduct']);
works: Route::get('user/{user}', ['as' => 'user.show', 'uses' => 'UserController@show']);
works: Route::post('user/{user}/update/password', ['as' => 'user.password.change', 'uses' => 'UserController@updatePassword']);
works: Route::get('/blog/{postCategory}/{post}', ['as' => 'post.show', 'uses' => 'PostController@show']);
Когда я делаю dd
для value
в RouteServiceProvider для user
, product
и post
я могу понять, в чем здесь проблема. Все values
они сбрасывают фактический slug
ресурс. Даже get
запрос на продукт является фактическим slug
. Однако при выполнении post
запроса для a product
я всегда получаю конец значения url
as. Конечно, это приводит к 404
.
Например, маршрут product/{product}/mark
с post
запросами выполняет сброс mark
as value
, а не slug
продукта… почему это так? Все остальные post
запросы работают нормально!
Я также попытался переключить маршрут с post
метода на get
метод, но здесь тот же результат … также 404
ошибка, и я mark
value
снова получаю as…
Кто-нибудь может объяснить, в чем здесь проблема и почему она не работает?
Когда я переключаюсь product/{product}/mark
на produkt/{product}/mark
него, он работает. Но почему? и почему ‘/product/{ProductType}/{product}’ работает? Это действительно странно..
С уважением и спасибо!
Комментарии:
1. если
product/{productType}/{product}
раньшеproduct/{product}/like|dislike|mark
, то возникнет конфликт, верно?2. кстати, вы знаете, что можете определить, какое поле использовать с неявными привязками?
3. @apokryfos да, этот маршрут
product/{productType}/{product}
является первым маршрутом в моей web.php досье. Но почему это вызывает конфликт?4. @lagbox как я могу это сделать?
Ответ №1:
Теперь я удалил свои изменения в RouteServiceProvider
и использую эту функцию, которая предоставляется начиная с Laravel 8. Проблема решена… Я не знаю, в чем проблема..
Комментарии:
1. Честно говоря, я не знаю, почему это решило проблему. Например, если у вас есть продукт с slug
like
и вы пытаетесь получить доступproduct/a-type/like
, как это будет использовать правильный маршрут вместо выполненияproduct/{product}/like
2. @apokryfos вуду