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

我正在使用 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  ·  4年前

感谢 @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 与资源控制器方法参数名称不一致

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
Summer
最佳答案

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

art route:list | grep DepartmentController

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

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

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

art route:list | grep DepartmentController

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

4年前 评论

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