隐式路由模型绑定



Laravel的隐式路由模型绑定不起作用。它没有查找标识符指示的记录。我要买一个全新的模型对象。

给定此代码:

Route::get('users/{user}', function (AppUser $user, $id) {
$user2 = $user->find($id);
return [
[get_class($user), $user->exists, $user],
[get_class($user2), $user2->exists],
];
});

这个URL:/users/1

我得到这个输出:

[["App\User",false,[]],["App\User",true]]

我使用的是PHP 7.2和Laravel 5.6。


附加信息

我已经在其他Laravel项目中成功地完成了隐式路由模型绑定。我正在开发一个现有的代码库。据我所知,该功能以前从未使用过。

用户记录已存在。它尚未被软删除。该模型不使用SoftDeletes特性。

我尝试过使用各种独特的路线名称和其他模型。

我已经检查了AppHttpKernel类中常见的罪魁祸首。$middlewareGroupsweb部分中具有IlluminateRoutingMiddlewareSubstituteBindings::class,,并且$routeMiddleware包含'bindings' => IlluminateRoutingMiddlewareSubstituteBindings::class,

它在Laravel中应该可以正常工作。我刚刚在我的Laravel 5.6应用程序中验证了它,这没有问题。

可能的情况你为什么得到这个:

  • 用户被软删除
  • 该路由不在web.phpapi.php文件内-两个组都在app/Http/Kernel.php文件的$midddlewareGroups属性内设置了bindings(或IlluminateRoutingMiddlewareSubstituteBindings::class
  • 您从其中一个组中删除了提到的绑定
  • 你已经设置了一些自定义绑定。例如,如果您在某处定义了如下代码: Route::bind('user', function($user) { return new AppUser(); });

    然后您将得到如您所示的结果,因为您使用自定义逻辑,并且只返回空的用户模型。

如果你认为以上都是错误的,我会从新的Laravel 5.6应用程序开始,尝试复制这个问题。

我终于解决了这个问题。routes/web.php中的路由没有web中间件。这通常在mapWebRoutes()函数中的app/Providers/RouteServiceProvider.php中完成。在某个时刻,在Laravel升级过程中,路线定义被破坏了。它看起来是这样的:

Route::group([
'namespace' => $this->namespace,
], function ($router) {
require base_path('routes/web.php');
});

它本可以更新,使用旧的定义风格,看起来像这样:

Route::group([
'middleware' => 'web',
'namespace' => $this->namespace,
], function ($router) {
require base_path('routes/web.php');
});

相反,我只是从laravel/laravel项目中复制了最新的方法链接样式,所以现在看起来是这样的:

/**
* Define the "web" routes for the application.
*
* These routes all receive session state, CSRF protection, etc.
*
* @return void
*/
protected function mapWebRoutes()
{
Route::middleware('web')
->namespace($this->namespace)
->group(base_path('routes/web.php'));
}

最新更新