Laravel 8 路由闭包中完成session校验后能否调用控制器方法?
问题报错根因
- 代码中调用的
controller('App\Http\Controllers\SiteController@edit_profile')不属于Laravel内置全局有效方法,系统无法识别该函数,直接触发运行报错 - 路由路径误写为
/home,和需要定义的/editprofile接口路径不匹配
符合需求的实现方案
可以完全参考/home路由的闭包写法,在闭包内先完成session校验,再通过Laravel服务容器调用控制器方法,全程不需要修改控制器的构造校验逻辑,参考代码如下:
Route::post('/editprofile', function (\Illuminate\Http\Request $request) { // 校验session字段,不满足条件直接重定向到登录页 if (!session()->has('username')) { return redirect('/'); } // 通过服务容器解析控制器实例,调用目标方法并透传请求对象 return app(\App\Http\Controllers\SiteController::class)->edit_profile($request); });
实现细节说明
- 用
app()服务容器解析控制器实例,会自动处理控制器构造函数的所有依赖注入,和路由直接绑定控制器的实例化逻辑完全一致,不会出现手动实例化时缺少依赖的报错 - 调用控制器方法时透传
Request对象,保证edit_profile方法可以正常获取前端提交的表单参数,和原生路由绑定的执行效果无差异 - 如果
edit_profile方法存在其他依赖注入参数,只需要在闭包的入参列表中通过类型提示引入对应依赖,调用控制器方法时透传即可,Laravel会自动解析对应实例
内容的提问来源于stack exchange,提问作者monterico
相关产品推荐
相关产品推荐

