Laravel自定义验证错误消息需严格遵循“字段名.规则名”键名格式,优先级从高到低为:validate()传入数组 > Form Request的messages()方法 > 语言包zh_CN/validation.php;支持:attribute、:min等占位符及通配符*.required,嵌套字段需转义点号。

自定义错误消息在 Laravel 表单验证中不是“加个提示”那么简单,关键在于写对键名、选对位置、理清优先级。写错一个点号或漏掉冒号,消息就根本不会生效。
messages() 方法里按字段.规则写键名
这是最常用也最推荐的方式,适用于 Form Request 类。键名必须严格遵循 字段名.规则名 格式,中间用英文点号连接,值是纯字符串。
- 比如
email.required对应邮箱必填提示,password.min对应密码长度不足提示 - 支持占位符:
:attribute自动替换为字段中文名(需配合语言包),:min、:max等自动代入规则参数 - 嵌套字段如
user.email,键名要写成user.email.required,不能写成user_email.required
validate() 调用时直接传消息数组
在控制器里调用 $request->validate() 时,第二个参数就是自定义消息数组。它的优先级最高,会覆盖 messages() 和语言文件里的同名提示。
- 键名规则和上面完全一致:
'title.required' => '标题不能为空' - 通配符可用:
'*.required' => '此项为必填项',匹配所有字段的 required 错误 - 字段名含点号(如
data.items.0.name)要转义:'data\.items\.0\.name.required'
Rule 对象的错误消息不能写对象名
用 Rule::in($list)、Rule::exists() 等时,很多人误以为键名要带 Rule::in,其实不对。Laravel 只认规则名本身,也就是 in 或 exists。
- 正确写法:
'status.in' => '状态值不合法' - 错误写法:
'status.Rule::in' => 'xxx'或'status.Rule::in($options)'—— 这两种都无效 - 动态规则的提示仍靠固定键名,内容可结合业务逻辑拼接,但键名结构不变
全局语言包是统一管理的基础
如果多数地方提示一致,建议把中文消息写进 resources/lang/zh_CN/validation.php。它作为兜底方案,优先级最低,但维护成本最小。
- 路径必须准确,Laravel 10 默认无中文包,需手动创建目录并复制基础文件
- 修改时不要删结构,只改对应键的值,例如:
'required' => ':attribute 必须填写' - 确保
config/app.php中'locale' => 'zh_CN'已设置,否则不生效


















