隐式路由模型绑定

时间:2018-08-02 18:36:58

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

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],
    ];
});

此URL:/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 个答案:

答案 0 :(得分:4)

它在Laravel中应该没有问题。我刚刚在Laravel 5.6应用程序中对其进行了验证,并且这没有问题。

可能的情况为何会出现此问题:

  • 用户被软删除
  • 此路由不在web.phpapi.php文件内-两组都在{{1}的bindings属性内设置了\Illuminate\Routing\Middleware\SubstituteBindings::class(或$midddlewareGroups) }}文件
  • 您从其中一个组中删除了提及的绑定
  • 您已经设置了一些自定义绑定。例如,如果您定义了以下代码:   app/Http/Kernel.php

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

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

答案 1 :(得分:0)

我终于解决了这个问题。 routes/web.php中的路由没有web中间件。这通常是在app/Providers/RouteServiceProvider.php函数的mapWebRoutes()中完成的。在某个时候,在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');
        });

相反,我只是从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'));
    }