【问题标题】:Laravel explicit route mode binding not working in some cases?Laravel 隐式路由模型绑定在某些情况下不起作用?
【发布时间】: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 的一些示例userproductpost

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 中为 userproductpost 执行 dd 时,我可以找出问题所在。所有values 都会转储资源的实际slug。甚至对产品的get 请求也是实际的slug。但是,在对product 执行post 请求时,我总是将url 的结尾作为值。当然这会导致404

例如,带有post 请求的路由product/{product}/markmark 转储为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


【解决方案1】:

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

【讨论】:

  • 老实说,我不知道为什么这解决了问题。例如,如果您的产品带有 slug like 并尝试访问 product/a-type/like 这将如何使用正确的路线而不是使用 product/{product}/like
  • @apokryfos 巫毒
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-12
  • 2019-01-10
  • 2018-05-26
  • 2018-02-28
  • 2018-11-28
  • 2011-09-04
  • 1970-01-01
相关资源
最近更新 更多