【问题标题】:Implicit Route Model Binding隐式路由模型绑定
【发布时间】:2019-01-10 14:44:03
【问题描述】:

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

鉴于此代码:

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

这个网址:/users/1

我得到这个输出:

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

我使用的是 PHP 7.2 和 Laravel 5.6。


其他信息

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

用户记录存在。它没有被软删除。该模型不使用SoftDeletes trait。

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

我已经检查了App\Http\Kernel 类的常见罪魁祸首。 $middlewareGroupsweb 部分中有\Illuminate\Routing\Middleware\SubstituteBindings::class,$routeMiddleware 包含'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,

【问题讨论】:

  • 是否对模型进行了任何自定义?列别名、行为等。
  • 用户实际存在。我从一个资源控制器和一个完全不同的模型开始了这次跋涉。您在我尝试提供minimal reproducible example 上方看到的内容。它告诉我 Laravel 中的某些内容配置不正确。
  • 听起来SubstituteBindings 没有运行。

标签: php laravel laravel-5 laravel-routing laravel-5.6


【解决方案1】:

我终于解决了这个问题。 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 项目中复制了latest method chaining style,所以它现在看起来像这样:

    /**
     * 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'));
    }

【讨论】:

    【解决方案2】:

    它应该在 Laravel 中没有任何问题。我刚刚在我的 Laravel 5.6 应用程序中验证了它,这没有问题。

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

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

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

    如果您认为以上所有内容都是错误的,我会从新的 Laravel 5.6 应用程序开始尝试复制该问题。

    【讨论】:

    • 我已经更新了我的问题以解决您的问题,但我可能遗漏了一些东西。
    • @Sonny 也许您应该尝试验证真正运行的是什么查询?您可以尝试使用我的github.com/mnabialek/laravel-sql-logger 包或github.com/barryvdh/laravel-debugbar 来查看查询是否真的在运行以及它的外观。您是否 100% 确定您使用的是与检查数据相同的数据库?
    • 我认为查询没有运行。中间件必须以某种方式短路。我完全迷路了。我再次更新了我的帖子以表明记录很容易加载。
    • @Sonny 对于您提供的信息,真的很难再说什么。正如我所说,您应该尝试使用一些数据库记录器来查看是否加载了查询。也许更多的东西被添加到查询中,也许你有一些自定义绑定,如果没有看到整个应用程序代码,真的很难说更多。
    猜你喜欢
    • 2016-06-10
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 2016-06-04
    相关资源
    最近更新 更多