Деякі дані потрібні на кожній сторінці: поточний користувач для шапки, назва застосунку, флеш-повідомлення, налаштування. Передавати їх у кожному контролері незручно - для цього є спільні дані (shared data).
На сервері - middleware HandleInertiaRequests, яке створює адаптер Laravel:
class HandleInertiaRequests extends Middleware
{
public function share(Request $request): array
{
return array_merge(parent::share($request), [
'appName' => config('app.name'),
'auth.user' => fn () => $request->user()?->only('id', 'name', 'avatar_url'),
'can' => fn () => [
'manageUsers' => $request->user()?->can('manage-users') ?? false,
],
]);
}
}
На клієнті - usePage():
import { usePage } from '@inertiajs/react';
export default function Header() {
const { auth, appName } = usePage().props;
return <header>{appName} · {auth.user?.name}</header>;
}
Спільні дані зливаються з props сторінки - назви варто групувати (auth.user, can.*), щоб не перетнутися з props конкретної сторінки.
Що видно в браузері - усе. Props сторінки, включно зі спільними, вбудовуються в HTML першої сторінки й приходять у JSON при кожному переході. Будь-хто може відкрити DevTools і прочитати їх. Звідси правила:
- передавати лише потрібні поля:
$user->only('id', 'name'), а не$request->user()цілком (там можуть бути email, телефон, службові прапорці, токени); - не класти секрети - ключі API, внутрішні налаштування;
- прапорці прав (
can.*) - для відображення, а не для захисту. Сховати кнопку «Видалити» можна за прапорцем, але контролер видалення перевіряє права сам.
Продуктивність:
- спільні дані обчислюються й передаються з кожною відповіддю - документація радить використовувати їх ощадливо;
- замикання (
fn () => ...) обчислюються лише тоді, коли prop справді потрібен (наприклад, не при частковому перезавантаженні інших props); Inertia::once()/shareOnce()(Inertia v3) - для даних, що не змінюються між переходами (довідник країн): клієнт отримує їх один раз і пам'ятає.
Флеш-повідомлення в Inertia v3 мають окремий механізм Inertia::flash() - їх не потрібно вручну додавати в спільні дані.