You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel自定义Rule对象无法读取组件内自定义验证错误消息问题

问题根因

Laravel 中直接实例化的类形式自定义验证规则,默认不会和规则别名做绑定,因此验证器无法识别你在$messages数组中定义的topic.profane配置,会直接走规则类自身message()方法返回的翻译内容,这是框架类规则和内置字符串规则的处理逻辑差异导致的。

解决方案

方案1:注册规则别名(推荐,用法和内置规则完全一致)

  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);
    });
}
  1. 修改请求类的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:保留类实例化写法,自定义消息传入

如果不想全局注册别名,可通过构造参数传递自定义消息:

  1. 修改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');
}
  1. 在rules方法中实例化规则时传入自定义消息即可:
'topic' => ['required', 'string', 'max:250', 'min:5', new Profane('some message')],

内容的提问来源于stack exchange,提问作者Shan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 10:36:00