Користувацькі правила валідації Laravel для підвищення цілісності даних

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 20 вересня, 2025
Ваша програма на Laravel може потребувати налаштування валідації для складних бізнес-вимог. Дізнайтеся, як створити кастомні правила валідації, які забезпечать чистий та тестований код, перетворюючи специфічні вимоги на багаторазові компоненти!

Створення надійних додатків на Laravel потребує більше, ніж стандартні правила валідації. Користувацькі правила валідації дозволяють структуровано вирішувати складні бізнес-вимоги, зберігаючи при цьому чистий і тестований код

Щоб створити власне правило валідації, спершу використовуйте команду Artisan для генерації класу правила. Це дозволить створити спеціальний об'єкт валідації, який реалізує інтерфейс ValidationRule Laravel:

namespace App\Rules;

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

class ValidSlug implements ValidationRule
{
    public function validate(string $attribute, mixed $value, Closure $fail): void
    {
        if (!preg_match('/^[a-z0-9-]+$/', $value)) {
            $fail('Поле :attribute повинно містити лише малі літери, цифри та дефіси.');
        }
    }
}

Застосування користувацьких правил відбувається так само, як і вбудованих правил валідації. Ви можете безперешкодно інтегрувати їх у запити форм або валідацію контролерів:

use App\Rules\ValidSlug;

$request->validate([
    'slug' => ['required', new ValidSlug],
    'title' => ['required', 'string', 'max:255'],
]);

Наприклад, у блозі потрібно валідувати коди категорій. Простий алфавітно-цифровий валідатор забезпечує послідовність форматування:

namespace App\Rules;

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

class CategoryCode implements ValidationRule
{
    public function validate(string $attribute, mixed $value, Closure $fail): void
    {
        if (strlen($value) !== 3 || !ctype_alnum($value)) {
            $fail('Поле :attribute повинно містити рівно 3 алфавітно-цифрових символи.');
        }
    }
}
$request->validate([
    'name' => ['required', 'string', 'max:100'],
    'code' => ['required', new CategoryCode],
    'description' => ['nullable', 'string'],
]);

Якщо валідація потребує гнучкості, ви можете передати параметри у ваші користувацькі правила під час створення:

namespace App\Rules;

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

class MinimumWordCount implements ValidationRule
{
    public function __construct(private int $minimumWords)
    {
    }

    public function validate(string $attribute, mixed $value, Closure $fail): void
    {
        $wordCount = str_word_count(strip_tags($value));

        if ($wordCount < $this->minimumWords) {
            $fail("Поле :attribute повинно містити щонайменше {$this->minimumWords} слів.");
        }
    }
}
$request->validate([
    'title' => ['required', 'string', 'max:200'],
    'content' => ['required', new MinimumWordCount(50)],
    'excerpt' => ['nullable', new MinimumWordCount(10)],
]);

Коли валідація потребує взаємодії з базою даних, користувацькі правила можуть отримувати доступ до моделей Eloquent та інших сервісів. Це приклад, який забезпечує унікальність електронної пошти в межах конкретного підрозділу:

namespace App\Rules;

use Closure;
use App\Models\User;
use Illuminate\Contracts\Validation\ValidationRule;

class UniqueEmailInDepartment implements ValidationRule
{
    public function __construct(private int $departmentId)
    {
    }

    public function validate(string $attribute, mixed $value, Closure $fail): void
    {
        $exists = User::where('email', $value)
                     ->where('department_id', $this->departmentId)
                     ->exists();

        if ($exists) {
            $fail('Ця електронна адреса вже зареєстрована у вашому підрозділі.');
        }
    }
}

Тестування користувацьких правил валідації стає простим завдяки спеціальним класам тестів. Ви можете перевірити як проходження, так і невдачу сценаріїв:

class ValidSlugTest extends TestCase
{
    public function test_accepts_valid_slugs()
    {
        $rule = new ValidSlug;
        $failed = false;

        $rule->validate('slug', 'my-blog-post', function() use (&$failed) {
            $failed = true;
        });

        $this->assertFalse($failed);
    }

    public function test_rejects_invalid_slugs()
    {
        $rule = new ValidSlug;
        $failed = false;

        $rule->validate('slug', 'My Blog Post!', function() use (&$failed) {
            $failed = true;
        });

        $this->assertTrue($failed);
    }
}

Власні правила валідації трансформують специфічні вимоги у повторно використовувані компоненти, які легко інтегруються з системою валідації Laravel. Вони забезпечують узгодженість в усьому додатку, зберігаючи логіку валідації організованою та тестованою. Чи обробляєте ви URL slug, вимоги до контенту чи складні бізнес-правила, користувацька валідація надає необхідну гнучкість для надійних додатків