Поддержка
Функции

Уведомления

Персональные уведомления пользователей — модель FrameNotification и встроенные mail-уведомления

Frame хранит персональные уведомления пользователей в таблице frame_notifications и показывает их в панели (колокольчик в навбаре). Это те же записи, что видны пользователю в разделе «Уведомления» — с пагинацией, архивом и кнопкой «Прочитано».

Помимо in-app уведомлений, пакет поставляет набор Laravel-нотификаций для критичных событий (вход в систему, OTP, восстановление пароля), которые отправляются по email.

Модель FrameNotification

Уведомления привязываются к любому notifiable — обычно к модели User, но через MorphTo может быть что угодно.

ПолеТипОписание
idUUIDПервичный ключ
typestringПроизвольный строковый тип события (например auth.login, order.created)
notifiable_id / notifiable_typemorphПолучатель
datajsonbПолезная нагрузка (см. FrameNotificationData ниже)
read_attimestamp nullableОтметка о прочтении
created_at / updated_attimestamps

Отправка уведомления

Базовый способ — статический метод 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():

title
string
Заголовок уведомления. Отображается жирным в карточке.
caption
string
Подпись под заголовком.
icon
?string
Имя иконки Tabler (например tabler-bell). Рендерится как SVG.
link
?string
URL, на который перейдёт пользователь по клику на уведомление. Относительный путь панели — например /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-событий. Они отправляются автоматически:

AuthorizedNotification
Отправляется после успешного входа. Содержит IP, устройство, платформу, гео-локацию и ссылку на страницу безопасности профиля. В письме есть кнопка «Это не я» со ссылкой на emergency-страницу (подписанная route, действует 1 час).
OtpNotification
Доставляет одноразовый OTP-код на email при входе, если FRAME_OTP_ENABLED=true.
PasswordResetNotification
Ссылка на восстановление пароля. Открывается по клику на «Сбросить пароль» на форме входа.

Шаблоны писем опубликованы после 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.