代码之家  ›  专栏  ›  技术社区  ›  Sonny

隐式路由模型绑定

  •  1
  • Sonny  · 技术社区  · 7 年前

    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 特质。

    我尝试过使用各种唯一的路由名称和其他模型。

    我查过了 App\Http\Kernel 为惯犯上课。 $middlewareGroups \Illuminate\Routing\Middleware\SubstituteBindings::class, web 剖面图和 $routeMiddleware 包含 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, .

    2 回复  |  直到 7 年前
        1
  •  4
  •   Marcin Nabiałek    7 年前

    在拉勒维尔应该没问题。我刚刚在我的Laravel 5.6应用程序中验证了它,这没有问题。

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

    • 用户被软删除
    • 这条路不在里面 web.php api.php 文件-两个组都设置了 bindings (或 \Illuminate\Routing\Middleware\SubstituteBindings::class )内部 $midddlewareGroups 财产 app/Http/Kernel.php 文件
    • 您从其中一个组中删除了上述绑定
    • 您已经设置了一些自定义绑定。例如,如果您在某个地方定义了如下代码: Route::bind('user', function($user) { return new \App\User(); });

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

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

        2
  •  0
  •   Sonny    6 年前

    我终于解决了这个问题。中的路线 routes/web.php 没有 web 中间件。这通常是在 app/Providers/RouteServiceProvider.php mapWebRoutes() 功能。在某个时刻,在一次拉弗升级中,路由定义被破坏了。看起来是这样的:

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

    相反,我只是复制了 latest method chaining style 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'));
        }