Створення надійних додатків на 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, вимоги до контенту чи складні бізнес-правила, користувацька валідація надає необхідну гнучкість для надійних додатків