Laravel Form Request中passedValidation修改值未在validated()生效问题
问题根本原因
- Laravel 中
Form Request的validated()方法读取的是类内部独立存储的$validated属性,该属性在验证规则全部执行通过的瞬间就已经完成赋值,和请求实例的参数包是完全隔离的两套数据。 passedValidation()钩子是在$validated属性赋值完成后才触发的,你在此处调用的merge()方法仅会修改请求的参数包(也就是$request->all()、$request->input()读取的数据源),不会同步更新已经生成好的$validated属性,所以调用validated()始终返回的是验证阶段的原始值。
适配方案
Laravel 9 及更低版本
直接修改类内部的受保护属性 $validated 即可,可选同步到请求参数包保证取值一致性:
protected function passedValidation() { // 格式化手机号后更新到验证结果存储 $this->validated['phone_field'] = 你的手机号格式化方法($this->validated['phone_field']); // 可选:同步到请求参数包,让 $request->input() 也能拿到格式化后的值 $this->merge(['phone_field' => $this->validated['phone_field']]); }
Laravel 10 及更高版本
框架提供了官方的 replaceValidated 方法用来更新验证结果:
protected function passedValidation() { $validated = $this->validated(); // 格式化手机号 $validated['phone_field'] = 你的手机号格式化方法($validated['phone_field']); // 整体替换验证结果 $this->replaceValidated($validated); // 可选:同步到请求参数包 $this->merge($validated); }
内容的提问来源于stack exchange,提问作者Fred Moras
相关产品推荐
相关产品推荐

