如何覆盖Laravel中自定义验证规则的消息?
How to override the message of the custom validation rule in Laravel?
我正在开发 Laravel 应用程序。我在我的应用程序中所做的是我试图覆盖自定义验证规则消息。
我在请求中有这样的验证规则class:
[
'name'=> [ 'required' ],
'age' => [ 'required', new OverAge() ],
];
通常情况下,我们会像这样覆盖规则的错误信息:
return [
'title.required' => 'A title is required',
'body.required' => 'A message is required',
];
但是我该如何对自定义验证规则执行此操作 class?
您不能简单地用请求的自定义消息覆盖它。如果你看一下 Validator
class:
/**
* 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()
直接添加到消息包中。
但是,您可以在自定义规则的 class 中为消息添加参数:
public function __construct(string $message = null)
{
$this->message = $message;
}
然后在你的消息函数中:
public function message()
{
return $this->message ?: 'Default message';
}
最后在你的规则中:
'age' => ['required', new OverAge('Overwritten message')];
使用 Laravel 9,支持覆盖消息,但您必须提供 FQDN 以进行验证 class。因此,您的 OverAge
自定义消息可能如下所示:
return [
'age.required' => 'An age is required',
'age.App\Rules\OverAge' => 'The age must be less than 65',
];
您可能还想为消息支持 place-holders,因此 65
可以替换为类似 :max-age
的内容。许多方法已发布,none 其中看起来特别干净。
我正在开发 Laravel 应用程序。我在我的应用程序中所做的是我试图覆盖自定义验证规则消息。
我在请求中有这样的验证规则class:
[
'name'=> [ 'required' ],
'age' => [ 'required', new OverAge() ],
];
通常情况下,我们会像这样覆盖规则的错误信息:
return [
'title.required' => 'A title is required',
'body.required' => 'A message is required',
];
但是我该如何对自定义验证规则执行此操作 class?
您不能简单地用请求的自定义消息覆盖它。如果你看一下 Validator
class:
/**
* 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()
直接添加到消息包中。
但是,您可以在自定义规则的 class 中为消息添加参数:
public function __construct(string $message = null)
{
$this->message = $message;
}
然后在你的消息函数中:
public function message()
{
return $this->message ?: 'Default message';
}
最后在你的规则中:
'age' => ['required', new OverAge('Overwritten message')];
使用 Laravel 9,支持覆盖消息,但您必须提供 FQDN 以进行验证 class。因此,您的 OverAge
自定义消息可能如下所示:
return [
'age.required' => 'An age is required',
'age.App\Rules\OverAge' => 'The age must be less than 65',
];
您可能还想为消息支持 place-holders,因此 65
可以替换为类似 :max-age
的内容。许多方法已发布,none 其中看起来特别干净。