Пользовательский класс правил в Laravel - как заставить сообщение работать? - PullRequest
0 голосов
/ 18 февраля 2020

Работа над существующим проектом, поэтому крайне важно сохранить структуру кода такой же, как и у других разработчиков.

Я создал новый Rule и добавил свой Validator::extend к boot(). Однако я не могу получить ошибку проверки для отображения моего пользовательского сообщения. Вместо этого просто отображается значение «validation.ruleName» по умолчанию

Я пишу правило проверки, которое использует пакет проверки номера NHS ImLiam. validate() и passes() работают успешно. Но сообщение об ошибке никогда не меняется.

Как получить метод messages() для отображения пользовательского вывода исключения? (Вместо «validation.nhsnumber» на скриншоте ниже?

enter image description here

App \ Forms \ MyForm: (используя Kris Forms )

public function buildForm()
{
    $this->add('nhs_number', 'number', [
        'label' => 'NHS Number',
        'rules' => 'nullable|nhsnumber',
    ]);
    ...
}

App \ Providers \ AppServiceProvider:

public function boot()
{

        Validator::extend('nhsnumber', \App\Rules\ValidNhsNumber::class);
}

App \ Rules \ ValidNhsNumber :

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;
use ImLiam\NhsNumber\InvalidNhsNumberException;
use ImLiam\NhsNumber\NhsNumber;

class ValidNhsNumber implements Rule
{
    private $message;

    /**
     * Create a new rule instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Determine if the validation rule passes.
     *
     * @param string $attribute
     * @param mixed $value
     * @return bool
     */
    public function passes($attribute, $value): bool
    {
        try {
            $nhsNumber = new NhsNumber($value);
            $nhsNumber->validate(); // Will throw exception here if false
            return true;
        } catch (InvalidNhsNumberException $e) {
            $this->message = $e->getMessage();
        }
    }

    public function validate($attribute, $value, $params): bool
    {
        return $this->passes($attribute, $value);
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return $this->message;
    }
}

Ответы [ 3 ]

0 голосов
/ 18 февраля 2020

Вы пытались сбросить $this->message;? Что это показывает, если вы сбросите его? Ты вообще добираешься до public function message()? Попробуйте ввести dd($this-message) в метод message().

Редактировать:

В вашем catch вы вообще ничего не возвращаете. Когда он входит в catch, он не возвращает false или true. Возвращается null.

0 голосов
/ 18 февраля 2020

Оказывается, это конфликт с KrisForms.

Но вы можете получить желаемый результат, слегка изменив то, как вы просите его обрабатывать правила.

В App \ Forms \ MyForm: Я изменил:

$this->add('nhs_number', 'number', [
            'label' => 'NHS Number',
            'rules' => 'nullable|nhsnumber',
]);

На это:

$this->add('nhs_number', 'number', [
            'label' => 'NHS Number',
            'rules' => [
                'nullable',
                new ValidNhsNumber()
            ]
]);

А затем убедился, что в улове блок я возвращаю false в passes().

0 голосов
/ 18 февраля 2020

Свойство вашего сообщения имеет значение null. Валидатор Laravels попытается получить сообщение об ошибке, вызывающее ваш метод message(), и, если ничего не возвращается, он будет использовать get_class($this), а затем попытается создать сообщение об ошибке.

Этот метод может либо вернуть перевод заполнитель, такой как validation.nhsnumber, или он может вернуть реальное сообщение. В приведенном вами примере ничего не возвращается.

...