Как реализовать систему уведомлений о рассмотрении заявок на разбан, тикетов в техподдержку и жалоб через PHP-шаблоны?
Реализация системы уведомлений для заявок на разбан, тикетов в техподдержку и жалоб через PHP-шаблоны — это комплексная задача, включающая несколько ключевых компонентов.
## 1. Архитектура системы
Система уведомлений строится из следующих элементов:
— **Модели данных** — таблицы tickets, ban_requests, complaints в БД
— **Менеджер уведомлений** — центральный класс NotificationManager
— **PHP-шаблоны** — файлы .php или .html с переменными-плейсхолдерами
— **Транспорт** — отправка через email, WebSocket, push или внутренние сообщения
## 2. Создание PHP-шаблонов
Создайте директорию `/templates/notifications/` и добавьте шаблоны:
php
// templates/notifications/ticket_status.php
<?php
$subject = "Статус вашего тикета #{$ticket_id} изменён";
$body = "
Здравствуйте, {$user_name}!
Ваш тикет #{$ticket_id} был обновлён.
Новый статус: {$status}
Комментарий администратора: {$admin_comment}
«;
## 3. Класс рендеринга шаблонов
php
class TemplateRenderer {
private string $templateDir;
public function __construct(string $dir) {
$this->templateDir = $dir;
}
public function render(string $template, array $vars): array {
extract($vars);
$file = $this->templateDir . ‘/’ . $template . ‘.php’;
if (!file_exists($file)) {
throw new RuntimeException(«Шаблон не найден: $template»);
}
ob_start();
include $file;
ob_end_clean();
return compact(‘subject’, ‘body’);
}
}
## 4. NotificationManager
php
class NotificationManager {
private TemplateRenderer $renderer;
private MailerInterface $mailer;
public function notifyTicketUpdate(int $ticketId, string $status, string $comment): void {
$ticket = Ticket::find($ticketId);
$data = $this->renderer->render(‘ticket_status’, [
‘ticket_id’ => $ticketId,
‘user_name’ => $ticket->user->name,
‘status’ => $status,
‘admin_comment’ => $comment,
]);
$this->mailer->send($ticket->user->email, $data[‘subject’], $data[‘body’]);
}
public function notifyBanRequest(int $requestId, string $decision): void {
// Аналогично для заявок на разбан
}
public function notifyComplaint(int $complaintId, string $result): void {
// Аналогично для жалоб
}
}
## 5. Очередь уведомлений
Для высоконагруженных систем рекомендуется использовать очередь задач (Redis + RabbitMQ или Laravel Queue). Уведомления помещаются в очередь и обрабатываются воркером асинхронно, что исключает задержки при ответе пользователю.
## 6. Типы уведомлений
— **Email** — для официальных решений по жалобам и разбанам
— **WebSocket/SSE** — для мгновенных уведомлений в интерфейсе
— **Push-уведомления** — для мобильных приложений
— **Внутренние сообщения** — уведомления в личном кабинете
## 7. Логирование
Все отправленные уведомления сохраняйте в таблицу `notification_log` с полями: user_id, type, template, sent_at, status. Это позволит отслеживать доставку и повторно отправлять при сбоях.
Такой подход обеспечивает гибкость, масштабируемость и удобство редактирования шаблонов без изменения бизнес-логики.
