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

7
我是一个 Laravel 应用程序的开发者。我的应用程序中,我正在尝试覆盖自定义验证规则消息。
在请求类中,我的验证规则如下:
[
    'name'=> [ 'required' ],
    'age' => [ 'required', new OverAge() ],
];

通常,我们会这样覆盖规则的错误消息:
return [
    'title.required' => 'A title is required',
    'body.required'  => 'A message is required',
];

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

2
你尝试使用过 age.over_age 吗? - Derek Pollard
1
您可以创建自定义规则 https://laravel.com/docs/5.8/validation#custom-validation-rules - user1405631
1
我认为这是一个 bug。欢迎提交 PR 到 laravel/framework。 - mpyw
2个回答

10

你不能仅仅用请求中的自定义消息来覆盖它。如果你查看 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), []
        ));
    }
}

正如你所看到的,这只是将$rule->message()直接添加到消息包中。

然而,在您自定义的规则类中,您可以为消息添加一个参数:

public function __construct(string $message = null)
{
    $this->message = $message;
}

然后在你的消息函数中:
public function message()
{
    return $this->message ?: 'Default message';
}

最后,在您的规则中:

'age' => ['required', new OverAge('Overwritten message')];

1
只是好奇,为什么要使用 ?: 而不是 ?? - Derek Pollard
1
@DerekPollard ?? 只检查它是否不为 null 和 isset。不检查它是否为正数。但两者都可以使用。 - Chin Leung

4
使用 Laravel 9,支持覆盖消息,但必须提供验证类的 FQDN。因此,您的自定义消息 OverAge 可能如下所示:
return [
    'age.required' => 'An age is required',
    'age.App\\Rules\\OverAge'  => 'The age must be less than 65',
];

您可能还希望支持消息的占位符,以便可以将65替换为类似:max-age的内容。已经发布了许多实现方式,但没有一种看起来特别简洁。


如果有人需要,这个答案对我有效。 - Jed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接