Система уведомлений на базе Event Bus и Notification Center
Система позволяет отправлять уведомления пользователям, просто публикуя событие в коде. Модуль событий сам перехватывает их и передает в центр уведомлений. Это обеспечивает высокую степень автоматизации процессов рассылки, минимизируя ручную работу и упрощая поддержку системы.
1. Краткие условия для работы (Чек-лист)
Чтобы уведомление ушло, должны быть выполнены все следующие условия:
- В модуле событий (
erp208):- В таблице
erp_208_event_subscribersесть запись с вашимevent_name. - У этой записи флаг
is_notification = 1иis_active = 1.
- В таблице
- В центре уведомлений (
erp217):- Подписка: В таблице
erp217_subscriptionsконкретный пользователь подписан на этот тип события (event_type) и канал (email/telegram). - Шаблон: В таблице
erp217_templatesсоздан текст письма/сообщения для этого события и канала. - Данные: У пользователя в профиле заполнен email или telegram_id (в зависимости от канала).
- Подписка: В таблице
2. Как это работает (Алгоритм)
- Вызов: Вы пишете в коде
EventBus::instance()->publish('order_ready', $data, $user_id). - Перехват: EventBus видит в БД, что на
'order_ready'стоит флагis_notification. - Передача: EventBus вызывает метод
_proxy_to_notification_center, который отправляет данные вService_Erp217_Bus. - Очередь: Центр уведомлений проверяет подписки пользователя, рендерит шаблон (заменяя
{{переменные}}на данные из$data) и кладет готовое сообщение в таблицуerp217_queue. - Отправка: Cron (планировщик) раз в минуту берет записи из очереди и физически отправляет их через SMTP или API мессенджеров.
3. Как это выглядит для пользователя
- Для разработчика:
- Это одна строчка кода. Не нужно заботиться о том, как отправить письмо или проверить настройки пользователя.
- Для администратора:
- В админке модуля 208 он просто ставит галочку "Отправлять в уведомления" для нужного события. В модуле 217 он правит текст шаблона.
- Для конечного пользователя:
- Он получает письмо или сообщение в Telegram только по тем событиям, которые он сам разрешил в своем личном кабинете (настройках уведомлений).
4. Пример настройки нового уведомления
Если вы добавили в систему событие "Новый комментарий" (new_comment):
- БД (208): Добавьте строку в
erp_208_event_subscribers:event_name='new_comment',is_notification=1. - БД (217): Создайте шаблон в
erp217_templates:event_alias='new_comment',subject='Новый комментарий',body='Вам написали: {{comment_text}}'. - Код:
Service_Erp208_EventBus::instance()->publish('new_comment', [
'comment_text' => 'Привет, как дела?',
'target_user_id' => 10 // ID получателя
], $author_id);
Сложно ли это?
Нет. Основная сложность (логика проверки, рендеринга и очередей) скрыта внутри сервисов. Для расширения системы достаточно добавлять записи в таблицы БД, не меняя программный код модулей.
Применение в практике
Такой подход позволяет внедрять новые типы уведомлений без изменения логики кода. Система становится гибкой и масштабируемой, а управление отправками реализуется через интерфейсы админки.