如何解决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
,user
和product
的一些示例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
和user
的RouteServiceProvider中为product
做post
时,我可以在这里找出问题所在。所有values
都会转储实际的slug
资源。甚至对产品的get
请求都是实际的slug
。但是,在对post
执行product
请求时,我总是以url
的结尾作为值。当然,这会导致404
。
例如,具有product/{product}/mark
请求的路由post
确实将mark
的内容转储为value
,而不是产品的slug
……为什么? ?所有其他post
请求都可以正常工作!
我也尝试将路由从post
方法切换到get
方法,但结果相同……也是404
错误,我得到mark
为{再次{1}} ...
任何人都可以解释这里的问题是什么以及为什么它不起作用吗?
当我将value
更改为product/{product}/mark
时,它正在工作。但为什么?为什么'/ product / {productType} / {product}'有效?真的很奇怪。
致以问候,谢谢!
解决方法
我现在已经删除了RouteServiceProvider
中的更改,并且我正在使用自Laravel 8起提供的this函数。问题已解决...我不知道问题出在什么地方。 / p>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。