为什么路由模型绑定返回空模型 ?

我正在使用 Laravel 的 资源控制器路由模型绑定 ,但是始终返回空的模型 ,下面是我的代码

下面是我的路由 ,定义了一个 部门管理资源控制器 的路由

// routes/web.php
// 部门管理
Route::resource('departments', 'Admin\DepartmentController');

我使用下面的命令创建了 部门管理资源控制器

$ php artisan make:controller DepartmentController --resource --model=Admin/DepartmentModel

下面是 Laravel 为我生成的 资源控制器动作( 方法 )

我使用 dd($departmentModel); 打印绑定的模型

/**
 * Update the specified resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \App\Model\DepartmentModel  $departmentModel
 * @return \Illuminate\Http\Response
 */
public function update(Request $request, DepartmentModel $departmentModel)
    //    public function update(DepartmentModel $departmentModel, Request $request)
    //    public function update(DepartmentModel $departmentModel)
{
    dd($departmentModel);
    //
    set_model_attribute($departmentModel, $request->all());
    $save_results = $departmentModel->save();
    return $save_results ? http_response('success', 200, $save_results) 
        : http_response('error', 500, $save_results);
}

下面是我前端发出请求的代码 ,我使用的是 vue + axios

// 更新数据
async update(id) {
    // 在这里发出的请求
    const { data: response } = await this.$http.put(`/admin/departments/${id}`, this.form_data)

    if (response.code == 200) {
        let node = array_search(id, this.tree_list_data, 'id')
        for (let key in this.form_data) {
            node[key] = this.form_data[key]
        }
    }

    this.$message({
        message: response.msg,
        type: response.code == 200 ? 'success' : 'error'
    })

}

dd($departmentModel); 的结果如下 ,始终是空的模型对象

为什么路由模型绑定返回空模型 ?

下面是我发出的 HTTP 请求信息的截图

为什么路由模型绑定返回空模型 ?

下面是我对解决这个问题已经做出的尝试 :

  1. 路由模型绑定似乎要求 URI 片段必须匹配 ,因此我尝试了不同的方法参数 ,如下
public function update(Request $request, DepartmentModel $departmentModel)
//    public function update(DepartmentModel $departmentModel, Request $request)
//    public function update(DepartmentModel $departmentModel)
  1. 我在网上搜索看似乎是要设置一个中间件 \Illuminate\Routing\Middleware\SubstituteBindings::class ,我查看 Laravel 默认的中间件配置 ,发现已经有了
 /**
  * The application's route middleware groups.
  *
  * @var array
  */
 protected $middlewareGroups = [
     'web' => [
         \App\Http\Middleware\EncryptCookies::class,
         \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
         \Illuminate\Session\Middleware\StartSession::class,
         // \Illuminate\Session\Middleware\AuthenticateSession::class,
         \Illuminate\View\Middleware\ShareErrorsFromSession::class,
         \App\Http\Middleware\VerifyCsrfToken::class,
         // 这里已经绑定过这个中间件了
         \Illuminate\Routing\Middleware\SubstituteBindings::class,
         // 我还尝试加入了 bindings ,虽然我不知道这是什么意思 ,但网上查到似乎与路由模型绑定有关
         'bindings',
     ],
     'api' => [
         'throttle:60,1',
         'bindings',
     ],
     'web.admin' => [
    ]
];

上述就是我的问题 ,路由模型绑定始终返回空的模型

附言 1  ·  5年前

感谢 @Summer 的回复 ,让我解决了这个问题 :

以下是问题的解决过程

我使用命令 php artisan route:list 查看路由列表 ,得到信息如下

+--------+-----------+-------------------------------------+---------------------------+------------------------------------------------------------------------+--------------
| Domain | Method | URI | Name | Action | Middleware |
+--------+-----------+-------------------------------------+---------------------------+------------------------------------------------------------------------+--------------
| | PUT|PATCH | admin/departments/{department} | admin.departments.update | App\Http\Controllers\Admin\DepartmentController@update | web |
+--------+-----------+-------------------------------------+---------------------------+------------------------------------------------------------------------+--------------

可以看到 Laravel 资源路由设置的 URI 是 admin/departments/{department}

但是 Laravel 为我生成的资源控制器方法定义是 :public function update(Request $request, DepartmentModel $departmentModel)

由于路由参数名称 {department} 与方法参数名称 $departmentModel 不一致 ,导致模型绑定失败

最终我将方法参数名称由 $departmentModel 改为 $department ,解决了这个问题

以下是额外的分析

我使用命令 php artisan make:controller DepartmentController --resource --model=Admin/DepartmentModel 生成资源控制器

使用 Route::resource('departments', 'Admin\DepartmentController'); 绑定资源路由

Laravel 默认的模型是不带 Model 后缀的 ,而我为模型添加了 Model 后缀

最终导致了自动生成的路由 URI 与资源控制器方法参数名称不一致

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
Summer
最佳答案

看下路由参数,以路由参数的值为准:

art route:list | grep DepartmentController

尝试下显式绑定 路由《Laravel 6 中文文档》

5年前 评论
讨论数量: 1
Summer

看下路由参数,以路由参数的值为准:

art route:list | grep DepartmentController

尝试下显式绑定 路由《Laravel 6 中文文档》

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!