У класичній SPA сервер на помилку валідації повертає 422 з JSON, а клієнт розкладає помилки по полях. Inertia працює інакше - так само, як звичайні форми Laravel:
- форма відправляється Inertia-запитом;
$request->validate()не проходить - Laravel перенаправляє назад і кладе помилки в сесію;- адаптер Inertia додає помилки з сесії в props сторінки (
errors); - Inertia бачить непорожній
page.props.errorsі вважає відправку невдалою - викликаєonError, а неonSuccess.
Відповідей 422 Inertia-застосунок не генерує взагалі.
public function store(Request $request)
{
$request->validate([
'email' => ['required', 'email', 'unique:users'],
'name' => ['required', 'max:100'],
]);
// ...
}
З useForm помилки потрапляють у form.errors автоматично. Без нього - через prop:
<script setup>
defineProps({ errors: Object });
</script>
<template>
<p v-if="errors.email">{{ errors.email }}</p>
</template>
Введене не губиться: після перенаправлення назад Inertia за замовчуванням зберігає стан компонента сторінки, тож поля не очищаються.
Error bags - для сторінки з кількома формами з однаковими назвами полів (дві форми з полем email):
router.post('/companies', data, { errorBag: 'createCompany' });
router.post('/users', data, { errorBag: 'createUser' });
// помилки прийдуть у page.props.errors.createCompany / .createUser
З useForm error bags не потрібні - помилки й так прив'язані до екземпляра форми.
Усі помилки поля, а не лише перша. За замовчуванням адаптер Laravel повертає по одній помилці на поле. Для всіх - protected $withAllErrors = true; у HandleInertiaRequests; тоді кожне поле містить масив рядків.
Часткові перезавантаження й помилки. errors передається завжди, тож порожній набір помилок з сервера затре клієнтські. Щоб зберегти помилки під час router.reload({ only: [...] }), у Inertia 3 є опція preserveErrors: true.
Попередня валідація (до відправки) - Laravel Precognition, підтримку якої вбудовано у форми Inertia.