在 Laravel 9 中创建全局校验类需在 AppServiceProvider@boot() 中用 Validator::extend() 注册闭包规则,如 'phone_zh',并配合 resources/lang/zh_CN/validation.php 配置错误提示和 Validator::replacer() 支持参数占位符,严禁查库、继承 Validator 或命名冲突。

在 Laravel 9 中创建全局校验类,本质是注册一个能在任意验证场景中以字符串形式调用的规则(比如 'phone_zh' 或 'strong_password'),它不依赖具体请求上下文,也不需要每次 new 实例,直接写在验证数组里就能用。
在 AppServiceProvider 中注册闭包规则
这是最常用、最稳妥的方式。所有全局规则都应在 AppServiceProvider@boot() 中注册,不能放在 register() —— 否则验证器实例尚未初始化,会报错。
- 打开
app/Providers/AppServiceProvider.php,在boot()方法内调用Validator::extend() - 第一个参数是规则名(字符串,如
'phone_zh'),第二个是闭包,接收$attribute、$value、$parameters和$validator四个参数 - 闭包内写纯校验逻辑,必须明确返回
true或false,不要抛异常、不要 echo、不要访问$this - 例如手机号规则:
return preg_match('/^1[3-9]\d{9}$/', $value) === 1;
补充中文错误提示
规则名注册后,Laravel 不知道怎么翻译错误信息,必须手动配语言包。
- 编辑
resources/lang/zh_CN/validation.php - 在
'custom'数组里加一项:'phone_zh' => ':attribute 格式不正确' - 如果想支持占位符(如传参限制长度),还需用
Validator::replacer()定义替换逻辑,例如把:min替换成实际参数值
支持带参数的全局规则
像 'min_uppercase:5' 这种带冒号参数的写法,需要两步配合:
- 注册时,
$parameters是一个索引数组,$parameters[0]就是5,可在闭包中直接使用 - 错误消息里用
':min'占位,在replacer回调中替换成$parameters[0] - 例如:
Validator::replacer('min_uppercase', function ($message, $attribute, $rule, $parameters) { return str_replace(':min', $parameters[0] ?? 1, $message); });
避免常见错误
全局规则看似简单,但几个坑容易导致验证静默通过或 500 错误:
- 不要在闭包里调用数据库查询——没事务上下文,可能查不到刚提交的数据;如需查库,应前置缓存或改用 Rule 类 + DataAwareRule
- 不要尝试继承 Validator 类——Laravel 验证机制基于规则名映射回调,不是靠方法存在性触发;重写类会导致升级失败或队列任务崩溃
- 不要在 message() 里写逻辑——全局规则没有 message() 方法,所有提示靠语言包和 replacer 控制
-
规则名别和内置规则冲突,比如叫
'required'或'email',否则行为不可预期


















