Создание кастомных правил валидации в Laravel

от автора

в
Время чтения: 2 мин.

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

1. Использование замыканий (Closures)

Самый простой способ добавить кастомное правило — использовать замыкание:

$validator = Validator::make($request->all(), [
    'title' => [
        'required',
        function ($attribute, $value, $fail) {
            if ($value === 'foo') {
                $fail('Поле '.$attribute.' не может быть "foo".');
            }
        },
    ],
]);

2. Создание классов правил

Для более сложных правил лучше создать отдельный класс. Laravel предоставляет команду для генерации класса правила:

php artisan make:rule Uppercase

Сгенерированный класс будет выглядеть так:

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class Uppercase implements Rule
{
    public function passes($attribute, $value)
    {
        return strtoupper($value) === $value;
    }

    public function message()
    {
        return 'Поле :attribute должно быть в верхнем регистре.';
    }
}

Использование:

use App\Rules\Uppercase;

$validator = Validator::make($request->all(), [
    'name' => ['required', new Uppercase],
]);

3. Правила с параметрами

Вы можете создавать правила, которые принимают параметры:

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class MaxWords implements Rule
{
    protected $maxWords;

    public function __construct($maxWords)
    {
        $this->maxWords = $maxWords;
    }

    public function passes($attribute, $value)
    {
        return count(explode(' ', trim($value))) <= $this->maxWords;
    }

    public function message()
    {
        return "Поле :attribute не должно содержать более {$this->maxWords} слов.";
    }
}

Использование:

use App\Rules\MaxWords;

$validator = Validator::make($request->all(), [
    'description' => ['required', new MaxWords(100)],
]);

4. Использование Rule::when для условной валидации

Laravel предоставляет удобный метод when для условного применения правил:

use Illuminate\Validation\Rule;

$validator = Validator::make($request->all(), [
    'role_id' => Rule::when($request->user()->is_admin, 'required|exists:roles,id'),
]);

5. Имплементация интерфейса ValidationRule (Laravel 9+)

В Laravel 9+ появился более простой интерфейс для создания правил:

namespace App\Rules;

use Closure;
use Illuminate\Contracts\Validation\ValidationRule;

class EvenNumber implements ValidationRule
{
    public function validate(string $attribute, mixed $value, Closure $fail): void
    {
        if ($value % 2 !== 0) {
            $fail("Поле :attribute должно быть четным числом.");
        }
    }
}

6. Регистрация кастомных правил в сервис-провайдере

Если вы часто используете кастомное правило, можно зарегистрировать его в сервис-провайдере:

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Validator;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Validator::extend('phone_number', function ($attribute, $value, $parameters, $validator) {
            return preg_match('/^\+?[0-9]{10,15}$/', $value);
        });

        Validator::replacer('phone_number', function ($message, $attribute, $rule, $parameters) {
            return str_replace(':attribute', $attribute, 'Неверный формат телефона.');
        });
    }
}

Использование:

$validator = Validator::make($request->all(), [
    'phone' => 'required|phone_number',
]);

Заключение

Создание кастомных правил валидации в Laravel — мощный инструмент для обеспечения целостности данных в вашем приложении. Выбирайте подход в зависимости от сложности вашего правила:

  • Для простых условий используйте замыкания
  • Для сложной логики создавайте классы правил
  • Для часто используемых правил регистрируйте их в сервис-провайдере

Кастомные правила делают вашу валидацию более выразительной и поддерживаемой, а также позволяют централизовать сложную логику проверки данных.


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Сколько будет 5 + 5?