Как переопределить сообщение пользовательского правила проверки в Laravel?

Я разрабатываю приложение Laravel. Что я делаю в своем приложении, так это то, что я пытаюсь переопределить сообщение пользовательского правила проверки.

У меня есть такие правила проверки в классе запроса:

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

Обычно мы переопределяем сообщение об ошибке правил следующим образом:

return [
    'title.required' => 'A title is required',
    'body.required'  => 'A message is required',
];

Но как я могу сделать это с пользовательским классом правила проверки?


person Wai Yan Hein    schedule 30.05.2019    source источник
comment
вы пробовали использовать age.over_age ?   -  person Derek Pollard    schedule 30.05.2019
comment
вы можете создать собственное правило laravel.com/docs/5.8/validation#custom- правила проверки   -  person    schedule 30.05.2019
comment
Я считаю, что это ошибка. Не стесняйтесь отправлять PR в laravel/framework.   -  person mpyw    schedule 11.04.2020


Ответы (1)


Вы не можете просто перезаписать его пользовательскими сообщениями запроса. Если вы посмотрите на класс 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')];
person Chin Leung    schedule 30.05.2019
comment
просто любопытно, зачем использовать ?: вместо ?? - person Derek Pollard; 31.05.2019
comment
@DerekPollard ?? проверяет только, не является ли оно нулевым и установлено. Не проверяет, положительный ли результат. Но оба работают. - person Chin Leung; 31.05.2019