Иногда Вам нужно получить доступ к определенным данным на многочисленных страницах Вашего приложения. Например, обычным вариантом использования для этого является отображение текущего пользователя в заголовке сайта. Передавать эти данные вручную в каждом ответе нецелесообразно. В этих ситуациях могут быть полезны общие данные.
Адаптеры на стороне сервера позволяют заранее назначать общие данные для каждого запроса. Обычно это делается вне Ваших контроллеров. Общие данные будут автоматически объединены с реквизитами страницы, предоставленными в Вашем контроллере.
/*
|----------------------------------------------------------------
| Через мидлвар HandleInertiaRequests (рекомендуется)
|----------------------------------------------------------------
*/
class HandleInertiaRequests extends Middleware
{
public function share(Request $request)
{
return array_merge(parent::share($request), [
// Синхронно
'appName' => config('app.name'),
// Отложенно
'auth.user' => fn () => $request->user()
? $request->user()->only('id', 'name', 'email')
: null,
]);
}
}
/*
|----------------------------------------------------------------
| Вручную
|----------------------------------------------------------------
*/
use Inertia\Inertia;
// Синхронно
Inertia::share('appName', config('app.name'));
// Отложенно
Inertia::share('user', fn (Request $request) => $request->user()
? $request->user()->only('id', 'name', 'email')
: null
);
После того, как Вы поделились данными на стороне сервера, Вы сможете получить к нему доступ в компонентах своей страницы в качестве свойств. Доступ к общим данным можно получить даже в компонентах, не относящихся к странице, но не в качестве реквизита в этих случаях. Вот пример того, как это сделать в компоненте макета.
<template>
<main>
<header>
<div>Вы вошли как: {{ user.name }}</div>
<nav>
<inertia-link href="/">Главная</inertia-link>
<inertia-link href="/about">О нас</inertia-link>
<inertia-link href="/contact">Контакты</inertia-link>
</nav>
</header>
<content>
<slot />
</content>
<footer></footer>
</main>
</template>
<script>
import { computed } from 'vue'
import { usePage } from '@inertiajs/inertia-vue3'
export default {
setup() {
const user = computed(() => usePage().props.value.auth.user)
return { user }
},
}
</script>
Еще один отличный вариант использования общих данных - это флэш-сообщения. Это сообщения, хранящиеся в сеансе только для следующего запроса. Вы часто устанавливаете флэш-сообщение после завершения задачи и перед перенаправлением на другую страницу.
Вот простой способ реализовать флэш-сообщения в Ваших приложениях Inertia. Сначала поделитесь флэш-сообщением по каждому запросу.
class HandleInertiaRequests extends Middleware
{
public function share(Request $request)
{
return array_merge(parent::share($request), [
'flash' => [
'message' => fn () => $request->session()->get('message')
],
]);
}
}
Затем отобразите флэш-сообщение во внешнем компоненте, таком как макет сайта.
<template>
<main>
<header></header>
<content>
<div v-if="$page.props.flash.message" class="alert">
{{ $page.props.flash.message }}
</div>
<slot />
</content>
<footer></footer>
</main>
</template>