为什么路由模型绑定返回空模型 ?
我正在使用 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 请求信息的截图
下面是我对解决这个问题已经做出的尝试 :
- 路由模型绑定似乎要求 URI 片段必须匹配 ,因此我尝试了不同的方法参数 ,如下
public function update(Request $request, DepartmentModel $departmentModel)
// public function update(DepartmentModel $departmentModel, Request $request)
// public function update(DepartmentModel $departmentModel)
- 我在网上搜索看似乎是要设置一个中间件
\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' => [
]
];
上述就是我的问题 ,路由模型绑定始终返回空的模型
感谢 @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 与资源控制器方法参数名称不一致
推荐文章: