Laravel:如何在Facade中注入FormRequest调用控制器方法?
解决方案
要在FormFacade里调用FormController的store方法并正确注入FormRequest获取验证后的数据,直接手动实例化FormRequest是行不通的——因为Laravel的请求验证逻辑是依赖服务容器解析时自动触发的,按下面两种方式实现即可:
方式一:用服务容器解析FormRequest(快速实现)
直接在createMethod里通过Laravel的服务容器解析FormRequest,解析过程会自动完成数据验证,之后再调用控制器方法:
use App\Http\Controllers\FormController; use App\Http\Requests\FormRequest; public function createMethod(Request $request) { // 先执行你的自定义逻辑 // ... // 解析FormRequest,自动触发验证规则,验证失败会抛出异常 $formRequest = app(FormRequest::class); // 实例化控制器并调用store方法 $controller = new FormController(); return $controller->store($formRequest); }
方式二:依赖注入控制器(更符合Laravel规范)
把FormController通过构造函数注入到FormFacade中,避免手动实例化,更符合依赖注入原则:
use App\Http\Controllers\FormController; use App\Http\Requests\FormRequest; class FormFacade { protected $formController; // 通过构造函数注入FormController public function __construct(FormController $formController) { $this->formController = $formController; } public function createMethod(Request $request) { // 先执行你的自定义逻辑 // ... // 解析FormRequest并触发验证 $formRequest = app(FormRequest::class); // 调用控制器的store方法 return $this->formController->store($formRequest); } }
注意事项
- 确保
FormRequest里的rules()和authorize()逻辑正常,解析时会自动执行这两个方法,验证失败会自动返回422错误响应,权限不通过则返回403。 - 如果当前请求需要传递额外参数到
FormRequest,可以在解析时手动绑定:$formRequest = app(FormRequest::class)->merge(['extra_param' => 'value']);
内容的提问来源于stack exchange,提问作者manjushreeroshan
相关产品推荐
相关产品推荐

