Привязка режима явного маршрута Laravel не работает в некоторых случаях?

#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 как я могу это сделать?

5. laravel.com/docs/8.x/routing#customizing-the-key

Ответ №1:

Теперь я удалил свои изменения в RouteServiceProvider и использую эту функцию, которая предоставляется начиная с Laravel 8. Проблема решена… Я не знаю, в чем проблема..

Комментарии:

1. Честно говоря, я не знаю, почему это решило проблему. Например, если у вас есть продукт с slug like и вы пытаетесь получить доступ product/a-type/like , как это будет использовать правильный маршрут вместо выполнения product/{product}/like

2. @apokryfos вуду