【发布时间】:2021-02-20 17:28:41
【问题描述】:
我在我的项目中使用 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']);
当我在 RouteServiceProvider 中为 user、product 和 post 执行 dd 时,我可以找出问题所在。所有values 都会转储资源的实际slug。甚至对产品的get 请求也是实际的slug。但是,在对product 执行post 请求时,我总是将url 的结尾作为值。当然这会导致404。
例如,带有post 请求的路由product/{product}/mark 将mark 转储为value 而不是产品的slug... 为什么会这样?所有其他 post 请求都可以正常工作!
我还尝试将路由从 post 方法切换到 get 方法,但这里的结果相同......还有一个 404 错误,我再次将 mark 变成 value......
谁能解释这里的问题是什么以及为什么它不起作用?
当我将 product/{product}/mark 更改为 produkt/{product}/mark 时,它正在工作。但为什么?为什么 '/product/{productType}/{product}' 有效?真是奇怪啊。。
诚挚的问候,谢谢!
【问题讨论】:
-
如果
product/{productType}/{product}早于product/{product}/like|dislike|mark那么会有冲突吗? -
顺便说一句,您知道您可以定义与隐式绑定一起使用的字段吗?
-
@apokryfos 是的,这条路线
product/{productType}/{product}是我的 web.php 文件中的第一条路线。但是为什么这会导致冲突呢? -
@lagbox 我该怎么做?
标签: php laravel routes http-status-code-404