Система уведомлений: Как через PHP сформировать сообщения для пользователя об установленной скидке, ответах на жалобы или тикеты с ссылками на профиль?

Система уведомлений — важная часть любого веб-приложения. Ниже разберём, как на PHP грамотно формировать сообщения для пользователей о скидках, ответах на жалобы и тикеты, включая ссылки на профиль.

## Архитектура системы уведомлений

Оптимальный подход — создать универсальный класс `Notification`, который принимает тип уведомления, данные пользователя и генерирует готовое сообщение.

php
class Notification {
private string $baseUrl;

public function __construct(string $baseUrl = ‘https://example.com’) {
$this->baseUrl = rtrim($baseUrl, ‘/’);
}

public function buildProfileUrl(int $userId): string {
return $this->baseUrl . ‘/profile/’ . $userId;
}

public function discountMessage(array $user, float $discount): string {
$profileUrl = $this->buildProfileUrl($user[‘id’]);
return sprintf(
‘Здравствуйте, %s! Вам установлена персональная скидка %.0f%%. ‘
. ‘Подробности в вашем профиле: %s’,
htmlspecialchars($user[‘name’]),
$discount,
$profileUrl
);
}

public function ticketReplyMessage(array $user, int $ticketId, string $preview): string {
$profileUrl = $this->buildProfileUrl($user[‘id’]);
$ticketUrl = $this->baseUrl . ‘/tickets/’ . $ticketId;
return sprintf(
‘Здравствуйте, %s! Получен ответ на ваш тикет #%d: «%s». ‘
. ‘Перейти к тикету: %s | Ваш профиль: %s’,
htmlspecialchars($user[‘name’]),
$ticketId,
htmlspecialchars(mb_substr($preview, 0, 80)),
$ticketUrl,
$profileUrl
);
}

public function complaintReplyMessage(array $user, int $complaintId, string $status): string {
$profileUrl = $this->buildProfileUrl($user[‘id’]);
$complaintUrl = $this->baseUrl . ‘/complaints/’ . $complaintId;
return sprintf(
‘Здравствуйте, %s! Статус вашей жалобы #%d изменён на «%s». ‘
. ‘Просмотреть жалобу: %s | Ваш профиль: %s’,
htmlspecialchars($user[‘name’]),
$complaintId,
htmlspecialchars($status),
$complaintUrl,
$profileUrl
);
}
}

## Использование класса

php
$notifier = new Notification(‘https://myshop.ru’);
$user = [‘id’ => 42, ‘name’ => ‘Иван Петров’, ’email’ => ‘ivan@example.com’];

// Уведомление о скидке
echo $notifier->discountMessage($user, 15);

// Ответ на тикет
echo $notifier->ticketReplyMessage($user, 1024, ‘Ваш вопрос рассмотрен, решение…’);

// Ответ на жалобу
echo $notifier->complaintReplyMessage($user, 305, ‘Рассмотрена’);

## Сохранение уведомлений в БД

Рекомендуется хранить уведомления в таблице `notifications` со столбцами: `id`, `user_id`, `type`, `message`, `url`, `is_read`, `created_at`. Это позволяет показывать колокольчик с непрочитанными уведомлениями в интерфейсе.

php
function saveNotification(PDO $pdo, int $userId, string $type, string $message, string $url): void {
$stmt = $pdo->prepare(
‘INSERT INTO notifications (user_id, type, message, url, is_read, created_at) ‘
. ‘VALUES (:uid, :type, :msg, :url, 0, NOW())’
);
$stmt->execute([‘:uid’ => $userId, ‘:type’ => $type, ‘:msg’ => $message, ‘:url’ => $url]);
}

## Отправка по email

Для email-уведомлений используйте PHPMailer или Symfony Mailer. Передавайте HTML-версию сообщения с кликабельными ссылками на профиль и тикет.

## Лучшие практики

— Всегда экранируйте пользовательские данные через `htmlspecialchars()`.
— Используйте очереди (например, Redis + воркер) для массовых рассылок.
— Разделяйте типы уведомлений константами или enum (PHP 8.1+).
— Добавляйте UTM-метки к ссылкам для аналитики переходов.
— Предусматривайте настройки подписки, чтобы пользователь мог отключить ненужные уведомления.


Задайте вопрос нейросети

Не нашли ответ? Спросите ИИ — он подготовит развёрнутую статью.