不使用依赖注入时如何通过自定义FormRequest验证请求并触发withValidator方法
Laravel 抽象控制器中手动触发FormRequest完整验证流程的解决方案
你当前的实现只提取了FormRequest的rules规则手动创建验证器,没有走FormRequest本身的完整验证生命周期,所以withValidator钩子、自定义验证消息、授权校验等逻辑都不会被触发。
下面是两种可直接落地的解决方案:
方案1:直接调用FormRequest的validate方法(最推荐)
直接通过容器解析你的FormRequest类,调用其内置的validate方法即可触发完整的验证流程,和控制器依赖注入的效果完全一致:
// 从容器解析FormRequest实例,会自动注入构造函数依赖、绑定当前请求数据 $customForRequest = app($requestModel); // 执行完整验证,自动触发authorize、rules、withValidator全部逻辑 $validatedData = $customForRequest->validate();
如果需要自定义传入验证数据而非用当前请求的数据,可以在验证前调用replace方法覆盖:
$customForRequest = app($requestModel); $customForRequest->replace($yourCustomDataArray); $validatedData = $customForRequest->validate();
方案2:手动创建验证器后显式调用withValidator
如果你确实需要自定义验证器的创建逻辑,可以在生成Validator实例后手动调用withValidator方法:
// 注意必须用容器解析,不要直接new,否则FormRequest的构造函数依赖会丢失 /** @var \Illuminate\Foundation\Http\FormRequest $customForRequest */ $customForRequest = app($requestModel); // 创建验证器时可以一并传入自定义消息、自定义属性 $validator = Validator::make( $this->request->all(), $customForRequest->rules(), $customForRequest->messages(), $customForRequest->attributes() ); // 手动触发withValidator钩子 $customForRequest->withValidator($validator); // 执行验证 $validatedData = $validator->validate();
注意事项
你提供的MassUpdateDocumentAttribute类中,withValidator方法闭包里引入的$documentAttributeRepository和$documentAttrTypeRepository需要通过FormRequest的构造函数注入才能正常使用,直接new实例会报未定义变量错误,用容器解析(app($requestModel))会自动处理依赖注入问题,不需要额外修改。
内容的提问来源于stack exchange,提问作者Nifay
相关产品推荐
相关产品推荐

