Уведомления
Frame хранит персональные уведомления пользователей в таблице frame_notifications и показывает их в панели (колокольчик в навбаре). Это те же записи, что видны пользователю в разделе «Уведомления» — с пагинацией, архивом и кнопкой «Прочитано».
Помимо in-app уведомлений, пакет поставляет набор Laravel-нотификаций для критичных событий (вход в систему, OTP, восстановление пароля), которые отправляются по email.
Модель FrameNotification
Уведомления привязываются к любому notifiable — обычно к модели User, но через MorphTo может быть что угодно.
| Поле | Тип | Описание |
|---|---|---|
id | UUID | Первичный ключ |
type | string | Произвольный строковый тип события (например auth.login, order.created) |
notifiable_id / notifiable_type | morph | Получатель |
data | jsonb | Полезная нагрузка (см. FrameNotificationData ниже) |
read_at | timestamp nullable | Отметка о прочтении |
created_at / updated_at | timestamps |
Отправка уведомления
Базовый способ — статический метод FrameNotification::notify():
use Frame\Laravel\Models\FrameNotification;
use Frame\Laravel\Notifications\FrameNotificationData;
FrameNotification::notify(
type: 'order.paid',
notifiable: $user,
data: FrameNotificationData::make(
title: 'Заказ оплачен',
caption: "Заказ №{$order->id} успешно оплачен",
icon: 'tabler-credit-card',
link: "/resources/orders/{$order->id}",
)->toArray(),
);
FrameNotificationData умеет сериализоваться в JSON напрямую — data: FrameNotificationData::make(...); но notify() ожидает массив, поэтому вызывается ->toArray().FrameNotificationData
DTO для содержимого уведомления. Используйте через ::make():
tabler-bell). Рендерится как SVG./resources/orders/123.Дополнительные поля добавляются через trait Metable:
FrameNotificationData::make(title: 'Новое', caption: 'Текст')
->withMeta(['variant' => 'success', 'source' => 'payment-gateway']);
Meta-поля попадают в data JSON и доступны фронтенду вместе с основными полями.
API-эндпоинты
Все эндпоинты находятся под префиксом Frame API (по умолчанию /api/frame) и требуют авторизации:
| Метод | Путь | Описание |
|---|---|---|
| GET | /notifications | Активные (непрочитанные) уведомления текущего пользователя. Параметры: from (unix timestamp), per_page (по умолчанию 5). |
| GET | /notifications/archive | Прочитанные уведомления (архив) с пагинацией. |
| POST | /notifications/{id} | Пометить как прочитанное. |
| DELETE | /notifications/{id} | Удалить уведомление текущего пользователя. |
| DELETE | /notifications | Очистить все уведомления текущего пользователя. |
Фронтенд (колокольчик в навбаре и страница /notifications) использует эти эндпоинты без дополнительной настройки.
GET /notifications возвращает только уведомления, у которых data.protected не равно false. Флаг data.protected = false помечает служебные уведомления, которые не должны показываться в общем списке.Встроенные mail-уведомления
Пакет поставляет готовые Laravel Notifications для стандартных auth-событий. Они отправляются автоматически:
FRAME_OTP_ENABLED=true.Шаблоны писем опубликованы после php artisan frame:publish в resources/views/vendor/frame/email/. Их можно редактировать точно так же, как обычные Blade-вьюхи.
Кастомные mail-уведомления
Для своих email-уведомлений используйте стандартный механизм Laravel — Notification::send($user, new MyNotification()). Frame не навязывает обёртку.
Если хотите дополнительно создать in-app запись при отправке email — вызовите FrameNotification::notify() рядом:
use Illuminate\Support\Facades\Notification;
Notification::send($user, new OrderPaidMail($order));
FrameNotification::notify(
type: 'order.paid',
notifiable: $user,
data: FrameNotificationData::make(
title: __('Order paid'),
caption: __('Order #:id has been paid', ['id' => $order->id]),
icon: 'tabler-credit-card',
link: "/resources/orders/{$order->id}",
)->toArray(),
);
Хранение и производительность
- Таблица
frame_notificationsиспользуетjsonbдляdata— доступны JSONB-операторы PostgreSQL для фильтрации по полям payload. - Индекс на
notifiable_{id,type}создан автоматически ($table->morphs()). - Удаление пользователя не каскадирует — удаляйте уведомления вручную или через глобальный listener
Deleting.