formrequest未生效主因是未显式注入控制器参数;authorize()默认返回false需手动设为true;手动调用validate()会跳过生命周期;条件规则required_if严格匹配且需配合trim;unique更新时须ignore自身;错误消息需按“字段名.规则名”格式在messages()中覆盖。

表单验证没拦住非法数据,大概率不是规则写错了,而是根本没走到验证逻辑里——FormRequest没被注入、authorize()返回了false、或误用了$request->validate()手动调用绕过生命周期。
FormRequest 类为什么没生效?
它不会自动运行,必须显式出现在控制器方法参数中,否则 Laravel 完全忽略它的 rules() 和钩子。
- 控制器方法签名必须是
public function store(StorePostRequest $request),不能是Request $request或request()辅助函数 -
authorize()方法默认返回false,不改就直接拒绝所有请求;简单场景直接写return true - 别在
StorePostRequest实例上调用$request->validate(),这会跳过整个 FormRequest 生命周期(withValidator、prepareForValidation全失效) - 只对
POST、PUT、PATCH、DELETE请求自动触发;GET请求需手动调用
required_if 这类条件规则总翻车?
它只控制“是否触发该字段的验证”,不改变其他规则行为,且匹配是严格相等(===),不是模糊判断。
-
required_if:status,active对前端传来的" status "(带空格)或"active\n"无效,建议搭配Trim规则一起用 - 布尔字段如
is_paid,前端 checkbox 提交的是字符串"1"或"on",别写required_if:is_paid,true,应写required_if:is_paid,1 -
nullable优先级高于required_if:写成'phone' => 'required_if:has_phone,1|nullable'会导致即使has_phone === "1",phone仍可为空 - 多个条件可用链式:
'carrier_name' => 'required_if:company,1|required_if:company,2',等价于“company 是 1 或 2 时必填”
unique 规则在更新时为什么总报“已存在”?
它默认把当前提交当全新记录查重,编辑场景下必须排除自身,否则永远过不去。
- 字符串写法容易漏参数:
'email' => 'unique:users,email,'.$user->id—— 第三个参数是主键值,第四个才是字段名(可省略,默认id) - 更安全用
Rule::unique():Rule::unique('users', 'email')->ignore($user),自动适配主键名(比如用uuid也不用额外指定) - 跨表唯一要串联写:
['email' => ['required', 'unique:users,email', 'unique:members,member_email']],每条unique都是一次独立查询 - 加
where条件时,Rule::unique('users','email')->where(fn ($q) => $q->where('company_id', $companyId))比字符串方式更可控;$companyId为空时得提前判断,否则生成WHERE company_id = NULL(不是IS NULL)
错误消息怎么精准绑定到字段?
全局语言包改的是所有地方,而实际项目里往往只要某个字段换提示,其他照旧。
- 在
FormRequest的messages()方法里覆盖,键名必须是"字段名.规则名"格式,例如'email.required' => '邮箱不能为空' - 数组字段如
items.*.name,对应消息键是'items.*.name.required',不是'items.name.required' - 嵌套字段如
profile.phone,必须写成'profile.phone.required' - 如果用了自定义
Rule类,在类里重写message()方法返回字符串,比语言包更局部、更优先
真正难的不是写规则,而是理解验证器什么时候执行、按什么顺序执行、以及每个规则背后真实的 SQL 和 PHP 判断逻辑。一个 required_if 后面跟 nullable,或一个 unique 漏掉 ignore,都可能让整页表单“看起来没验证”。











