Деякі дані потрібні майже на кожній сторінці: поточний користувач у шапці, назва застосунку, налаштування. Передавати їх у кожному контролері незручно - для цього є спільні дані в middleware HandleInertiaRequests:
class HandleInertiaRequests extends Middleware
{
public function share(Request $request): array
{
return [
...parent::share($request),
'appName' => config('app.name'),
'auth' => [
'user' => fn () => $request->user()?->only('id', 'name', 'avatar_url'),
],
];
}
}
<script setup>
import { computed } from 'vue';
import { usePage } from '@inertiajs/vue3';
const page = usePage();
const user = computed(() => page.props.auth.user);
</script>
Спільні дані зливаються з props сторінки - тож простір імен (auth.user) захищає від зіткнень із props контролерів.
Головні правила:
- спільні дані йдуть з кожною відповіддю - кожен перехід і кожне часткове перезавантаження. Важкий запит тут - податок на всі сторінки. Замикання (
fn () => ...) обчислюються лише тоді, коли prop справді потрібен; - рідко змінні дані (список країн, налаштування) -
Inertia::once()чи методshareOnce(): клієнт запам'ятовує значення й не отримує його з кожною відповіддю; - усе видно в браузері.
$request->user()безonly()віддасть усі атрибути моделі в JSON кожної сторінки - email, телефон, службові прапорці, усе, що не в$hidden. Передавайте явний перелік полів чи ресурс; - ролі й права - готовими булевими значеннями для інтерфейсу (
can.manageUsers), а не списком усіх дозволів системи.
Валідаційні помилки адаптер Laravel уже додає в спільні дані (errors), а флеш-дані в Inertia 3 мають окремий механізм Inertia::flash().
Версія ассетів визначається в тому самому middleware (метод version()) - для Vite вона обчислюється автоматично.