Пользовательские правила валидации в Laravel

RedDeveloper
16.11.2022 13:12
Пользовательские правила валидации в Laravel

Если вы хотите создать свое собственное правило валидации, Laravel предоставляет возможность сделать это. Создайте правило с помощью следующей команды. Давайте создадим правило, которое будет проверять, что строка написана в верхнем регистре.

php artisan make:rule Uppercase

Этот класс будет создан в каталоге app/Rules. Он содержит метод pass и метод message. Метод passes содержит фактическое правило и принимает атрибут и его значение. Метод Message содержит сообщение об ошибке, если валидация не прошла.

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class Uppercase implements Rule
{
    /**
     * 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)
    {
        return $value == strtoupper($value);
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return 'The :attribute must be uppercase.';
    }
}

Давайте выполним валидацию с помощью этого правила. Я создал две строки. Одна из них в верхнем регистре, а другая нет. Давайте применим правило и проверим результат.

Route::get('/', function () {
    $pass_name = 'MS';
    $fail_name = 'ms';

    $data = [
      'pass_name' => $pass_name,
      'fail_name' => $fail_name,
    ];

    $validator = Validator::make($data, [
        'pass_name' => ['required', new Uppercase()],
        'fail_name' => ['required', new Uppercase()],
    ]);

    if ($validator->fails()) {
        dd($validator->errors()->messages());
    } else {
        dd('passed');
    }
});

Теперь при выполнении этого кода вы увидите, что валидатор даст сбой и вернет ошибку в поле fail_name.

array:1 [▼ 
  "fail_name" => array:1 [▼0 => "The fail name must be uppercase."
  ]
]

Если класс вашего пользовательского правила валидации должен иметь доступ ко всем другим данным, проходящим валидацию, ваш класс правила может реализовать интерфейс Illuminate\Contracts\Validation\DataAwareRule. Этот интерфейс требует, чтобы ваш класс определил метод setData. Этот метод будет автоматически вызываться Laravel (до начала валидации) со всеми проверяемыми данными.

class Uppercase implements Rule, DataAwareRule
{
    protected $data = [];

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

    /**
     * Set the data under validation.
     *
     * @param  array  $data
     * @return $this
     */
    public function setData($data)
    {
        $this->data = $data;

        return $this;
    }

    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        return $value == strtoupper($value);
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return 'The :attribute must be uppercase.';
    }
}

Теперь свойство data класса Uppercase содержит все проверяемые данные, которые в нашем случае являются массивом $data, содержащим оба имени.

Или, если ваше правило проверки требует доступа к экземпляру валидатора, выполняющему проверку, вы можете реализовать интерфейс ValidatorAwareRule.

class Uppercase implements Rule, ValidatorAwareRule
{
    protected $validator = [];

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

    /**
     * Set the current validator.
     *
     * @param  \Illuminate\Validation\Validator  $validator
     * @return $this
     */
    public function setValidator($validator)
    {
        $this->validator = $validator;

        return $this;
    }

    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        return $value == strtoupper($value);
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return 'The :attribute must be uppercase.';
    }
}

Теперь ваш класс правила имеет доступ к экземпляру валидатора.

Использование замыканий

Если функциональность пользовательского правила нужна только один раз в вашем приложении, вы можете использовать закрытие вместо объекта правила. Закрытие получает имя атрибута, значение атрибута и обратный вызов $fail, который должен быть вызван в случае неудачной валидации. Приведенная выше проверка может быть выполнена следующим образом.

use Illuminate\Support\Facades\Validator;
 
$validator = Validator::make($data, [
    'pass_name' => [
        'required',
        function ($attribute, $value, $fail) {
            if ($value !== strtoupper($value)) {
                $fail('The '.$attribute.' must be uppercase.');
            }
        },
    ],
    'fail_name' => [
        'required',
        function ($attribute, $value, $fail) {
            if ($value !== strtoupper($value)) {
                $fail('The '.$attribute.' must be uppercase.');
            }
        },
    ],
]);
Получение данных из формы с помощью JavaScript - краткое руководство
Получение данных из формы с помощью JavaScript - краткое руководство

17.11.2022 16:30

Получить данные из формы с помощью JS очень просто: вы запрашиваете элемент формы, передаете его конструктору new FormData() и, наконец, получаете нужную информацию с помощью метода .get().

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML

15.07.2022 14:37

Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно является внешний метод. Это помогает сохранить код незагроможденным и организованным. Однако ситуация может диктовать использование двух других методов....

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly

16.05.2022 21:25

Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату, категорию, пол, местоположение, рейтинг, должность, страну, штат и т.д... и даже после заполнения всех этих данных вам будет предложена капча, которую...

Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)

18.04.2022 13:17

Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно использовать выбранный нами фреймворк, и он становится основным подходом к каждому новому продукту. Однако существует и другой подход к разработке. Вы...

Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React

13.04.2022 15:26

Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей. Первое, что вам нужно сделать, это установить гем Flatpickr через npm. Вы можете найти эту информацию на их сайте или просто использовать следующий код:

В чем разница между Promise и Observable?
В чем разница между Promise и Observable?

11.04.2022 20:00

Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.