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

1
Перекладено ШІ
Оригінал: Laravel News
Оновлено: 01 січня, 2026
Ваша програма на 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, вимоги до контенту чи складні бізнес-правила, користувацька валідація надає необхідну гнучкість для надійних додатків

Популярні

Logomark Logotype

Оптимізація запитів до бази даних за допомогою скорочених методів Laravel

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

Logomark Logotype

4 поширені помилки Vite у Laravel

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

Logomark Logotype

Що нового в PHP 8.5

PHP 8.5 обіцяє безліч нових можливостей, таких як оператор Pipe, функції `array_first()` та `array_last()`, а також нове розширення URI. Чи готові ви дізнатися, як ці функції можуть спростити вашу розробку? Читайте далі, щоб дізнатися більше про ці захоплюючі нововведення