You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 21:39:05