Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас

Правила валідації Laravel

Перевірити правила валідації на тестових даних

Дані надсилаються на сервер, але не зберігаються

Цей інструмент не можна виконати у браузері, тому введені дані надсилаються на наш сервер. Ми обробляємо їх у пам'яті та одразу повертаємо результат: нічого не записується в базу, у файли чи в логи, нічого не передається третім сторонам. Та все ж не вставляйте сюди справжні робочі паролі чи ключі - для чутливих даних краще скористатися локальними інструментами.

Поділитись

Навіщо запускати правила окремо

Валідація в Laravel описується компактно - 'email' => 'required|email|max:255' - і саме через компактність легко помилитися: не в тому порядку, не те правило, не той тип даних. Замість того щоб щоразу тицяти форму в браузері, простіше подати правила й тестові дані сюди.

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

Що тут не виконується

Правила exists і unique звертаються до бази. Виконувати їх означало б робити запит до нашої схеми з чужим аргументом, тож вони пропускаються й позначаються окремо.

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

// Кожен такий рядок - окремий SELECT під час валідації
'email' => 'required|email|unique:users,email',

// На гарячих ендпоінтах індекс на колонці обов'язковий,
// інакше валідація стає найповільнішою частиною запиту

Порядок правил має значення

Правила виконуються зліва направо, і в цьому є практична різниця:

// Правильно: спершу перевіряємо наявність, потім формат
'email' => 'required|email',

// Навпаки - на порожньому полі отримаєте помилку формату
// замість зрозумілого «поле обов'язкове»
'email' => 'email|required',

nullable має стояти перед рештою, інакше null не пройде через правила типу:

'website' => 'nullable|url',   // null дозволений
'website' => 'url|nullable',   // null впаде на url

Правила, які плутають

required vs filled vs present. required вимагає, щоб поле було і не було порожнім. filled - щоб не було порожнім, якщо воно є. present - щоб поле було, хоч і порожнє.

size залежить від типу. Для рядка це довжина, для числа - саме значення, для масиву - кількість елементів, для файлу - кілобайти. Одне правило, чотири різні сенси.

integer не приводить тип. Рядок "15" пройде integer, але в базу піде рядком. Приведення - справа касту в моделі або $request->integer('age').

confirmed шукає поле з суфіксом _confirmation. Для password це password_confirmation - назва фіксована.

У Laravel

// Form Request - правильне місце для правил складніших за два рядки
class StoreVacancyRequest extends FormRequest
{
    public function rules(): array
    {
        return [
            'title' => ['required', 'string', 'max:255'],
            'salary_min' => ['nullable', 'integer', 'min:0'],
            'salary_max' => ['nullable', 'integer', 'gte:salary_min'],
        ];
    }

    public function messages(): array
    {
        return ['salary_max.gte' => 'Верхня межа не може бути меншою за нижню.'];
    }
}
// Правила-об'єкти читабельніші за рядок із трьома двокрапками
use Illuminate\Validation\Rules\Password;

'password' => ['required', 'confirmed', Password::min(12)->letters()->numbers()->uncompromised()],

uncompromised() варте окремої згадки: воно звіряє пароль із базою реальних витоків, надсилаючи лише перші п'ять символів його SHA-1 - сам пароль нікуди не йде.

Правило regex бере патерн цілком, із роздільниками - перевірити його можна тестером PCRE.