Laravel自定义Rule对象无法读取组件内自定义验证错误消息问题
问题根因
Laravel 中直接实例化的类形式自定义验证规则,默认不会和规则别名做绑定,因此验证器无法识别你在$messages数组中定义的topic.profane配置,会直接走规则类自身message()方法返回的翻译内容,这是框架类规则和内置字符串规则的处理逻辑差异导致的。
解决方案
方案1:注册规则别名(推荐,用法和内置规则完全一致)
- 在
AppServiceProvider的boot方法中注册规则别名:
use App\Rules\Profane; use Illuminate\Support\Facades\Validator; public function boot() { Validator::extend('profane', function ($attribute, $value, $parameters, $validator) { return (new Profane)->passes($attribute, $value); }); }
- 修改请求类的
rules方法,将new Profane改为字符串别名:
public function rules() { return[ 'topic' => ['required', 'string', 'max:250', 'min:5', 'profane'], 'name' => ['required', 'string', 'max:250'], 'email' => ['required', 'email:rfc,dns', 'max:250'] ]; }
调整后你原有$messages数组中的topic.profane配置即可正常生效,同时也支持全局在validation.php翻译文件中定义默认消息。
方案2:保留类实例化写法,自定义消息传入
如果不想全局注册别名,可通过构造参数传递自定义消息:
- 修改
Profane规则类,新增构造参数接收自定义消息:
protected $customMessage; // 新增构造方法 public function __construct($customMessage = null) { $this->customMessage = $customMessage; } public function passes($attribute, $value) { $profane = ProfaneWord::all(); $words = $profane->pluck('word'); foreach ($words as $word) { if (stripos($value, $word) !== false) return false; } return true; } public function message() { // 优先用传入的自定义消息,没有则走默认翻译 return $this->customMessage ?? trans('validation.profane'); }
- 在
rules方法中实例化规则时传入自定义消息即可:
'topic' => ['required', 'string', 'max:250', 'min:5', new Profane('some message')],
内容的提问来源于stack exchange,提问作者Shan
相关产品推荐
相关产品推荐

