Правила валідації 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.
- Де виконується
- на сервері
- Категорія
- Laravel