首页 > 解决方案 > Laravel 显式路由模式绑定在某些情况下不起作用?

问题描述

我在我的项目中使用 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、 aproduct和 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']);

当我在 RouteServiceProvider 中为做一个ddfor时,我可以弄清楚这里有什么问题。所有这些都转储了资源的实际值。甚至对产品的要求也是实际的。但是,在执行 a请求时,我总是得到as 值的结尾。当然,这会导致.valueuserproductpostvaluessluggetslugpostproducturl404

例如,product/{product}/mark带有post请求的路由确实会转储mark为产品value而不是slug产品的...为什么会这样?所有其他post请求工作正常!

我也尝试将路由从post方法切换到get方法,但结果相同......也是一个404错误,我再次mark得到value......

谁能解释这里的问题以及为什么它不起作用?

当我改变它时product/{product}/markprodukt/{product}/mark它正在工作。但为什么?为什么 '/product/{productType}/{product}' 有效?这真的很奇怪。。

亲切的问候,谢谢!

标签: phplaravelrouteshttp-status-code-404

解决方案


我现在已经删除了我的更改,RouteServiceProvider并且我正在使用自 Laravel 8 以来提供的这个功能。问题解决了......我不知道问题是什么......


推荐阅读