Laravel 8 如何为自定义Validation Rule注册字符串标识符
Laravel 8 自定义验证规则注册为字符串调用方法
完全可以实现,只需要在服务提供者中注册规则别名即可,操作步骤如下:
操作步骤
- 打开应用服务提供者文件
app/Providers/AppServiceProvider.php - 在
boot()方法中添加自定义规则注册逻辑,示例代码如下(以你创建的Euro规则为例):
<?php namespace App\Providers; use Illuminate\Support\Facades\Validator; use App\Rules\Euro; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { public function register() { // } public function boot() { // 注册euro规则别名 Validator::extend('euro', function ($attribute, $value, $parameters, $validator) { // 直接调用已创建的Rule类的校验逻辑 return (new Euro)->passes($attribute, $value); }); // 可选:复用Rule类中定义的错误提示 Validator::replacer('euro', function ($message, $attribute, $rule, $parameters) { return str_replace(':attribute', $attribute, (new Euro)->message()); }); } }
- 配置完成后即可直接使用字符串形式调用规则:
$rules = [ 'amount' => 'required|euro' ];
支持带参数的规则
如果你的自定义规则需要传参,比如要实现 euro:100 这种格式,只需要调整注册逻辑传入参数即可:
Validator::extend('euro', function ($attribute, $value, $parameters, $validator) { // parameters数组就是|分隔后的参数,这里将第一个参数传入Rule类 return (new Euro($parameters[0] ?? null))->passes($attribute, $value); });
注意事项
- 规则别名建议统一使用小写,和Laravel内置规则命名风格保持一致,避免出现大小写匹配问题
- 注册完成后全局生效,无需额外配置即可在所有验证场景使用字符串形式调用
内容的提问来源于stack exchange,提问作者degebine
相关产品推荐
相关产品推荐

