Повідомлення «Користувача створено» має з'явитися один раз після дії й не повторюватися. Раніше в Inertia-застосунках його передавали через session()->flash() і спільні дані middleware. У Inertia 3 для цього є окремий механізм - флеш-дані.
На сервері:
use Inertia\Inertia;
public function store(StoreUserRequest $request)
{
$user = User::create($request->validated());
Inertia::flash('toast', ['type' => 'success', 'message' => 'Користувача створено']);
return back();
// або коротше: return Inertia::flash('newUserId', $user->id)->back();
}
flash() можна поєднувати і з render(): Inertia::render(...)->flash('highlight', $id).
На клієнті - у page.flash, окремо від props:
<script setup>
import { usePage } from '@inertiajs/vue3';
const page = usePage();
</script>
<template>
<div v-if="page.flash.toast" class="toast">{{ page.flash.toast.message }}</div>
</template>
Або реагувати подією - в одному місці макета:
router.on('flash', (event) => {
if (event.detail.flash.toast) showToast(event.detail.flash.toast);
});
router.post('/users', data, {
onFlash: ({ newUserId }) => highlight(newUserId),
});
Чим кращий за флеш через сесію в props:
- не потрапляє в історію браузера. Props зберігаються в стані історії: користувач натиснув «Назад» - і старе «Збережено» знову на екрані. Флеш-дані в історію не пишуться;
- не змішується з props сторінки;
- працює однаково з редиректом і без нього: middleware сам зберігає флеш у сесію при перенаправленні.
Що варто знати:
- обробники
router.on(...), зареєстровані в компонентах, треба знімати при демонтажі (функція, яку повертаєon), інакше в непостійних макетах вони накопичуються; - флеш - для одноразових повідомлень, а не для даних, які мають бути на сторінці після оновлення;
- як і props, флеш-дані видно в браузері - лише публічна інформація.