如何在 Laravel 中覆盖自定义验证规则的消息?

Wai*_*ein 3 validationrules laravel laravel-validation

我正在开发 Laravel 应用程序。我在我的应用程序中所做的是我试图覆盖自定义验证规则消息。

我在请求类中有这样的验证规则:

[
    'name'=> [ 'required' ],
    'age' => [ 'required', new OverAge() ],
];
Run Code Online (Sandbox Code Playgroud)

通常,我们会像这样覆盖规则的错误消息:

return [
    'title.required' => 'A title is required',
    'body.required'  => 'A message is required',
];
Run Code Online (Sandbox Code Playgroud)

但是如何对自定义验证规则类执行此操作?

Chi*_*ung 5

您不能简单地用请求的自定义消息覆盖它。如果你看看这个Validator类:

/**
 * Validate an attribute using a custom rule object.
 *
 * @param  string  $attribute
 * @param  mixed  $value
 * @param  \Illuminate\Contracts\Validation\Rule  $rule
 * @return void
 */
protected function validateUsingCustomRule($attribute, $value, $rule)
{
    if (! $rule->passes($attribute, $value)) {
        $this->failedRules[$attribute][get_class($rule)] = [];

        $this->messages->add($attribute, $this->makeReplacements(
            $rule->message(), $attribute, get_class($rule), []
        ));
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,它只是将$rule->message()直接添加到消息包中。

但是,您可以在自定义规则的类中为消息添加参数:

public function __construct(string $message = null)
{
    $this->message = $message;
}
Run Code Online (Sandbox Code Playgroud)

然后在您的消息功能中:

public function message()
{
    return $this->message ?: 'Default message';
}
Run Code Online (Sandbox Code Playgroud)

最后在你的规则中:

'age' => ['required', new OverAge('Overwritten message')];
Run Code Online (Sandbox Code Playgroud)


Jas*_*son 5

使用 Laravel 9,支持覆盖消息,但您必须提供验证类的 FQDN。所以您的OverAge自定义消息可能如下所示:

return [
    'age.required' => 'An age is required',
    'age.App\\Rules\\OverAge'  => 'The age must be less than 65',
];
Run Code Online (Sandbox Code Playgroud)

您可能还想支持消息的占位符,因此可以65将 替换为:max-age. 已经发布了许多实现此目的的方法,但没有一种看起来特别干净。