Introdução
Em muitas aplicações web, notificações são um elemento essencial para manter os usuários atualizados sobre eventos importantes. No Symfony, podemos criar um sistema de notificações personalizado para alertar usuários sobre eventos específicos dentro da aplicação. Neste artigo, vamos explorar como criar este sistema de notificações personalizado no Symfony.
Passo 1: Criando uma tabela de notificações
O primeiro passo para criar um sistema de notificações personalizado no Symfony é criar uma tabela de notificações no banco de dados da aplicação. Esta tabela armazenará as notificações que serão exibidas para os usuários.
CREATE TABLE `notifications` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`message` varchar(255) NOT NULL,
`read_at` datetime DEFAULT NULL,
`created_at` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
Passo 2: Criando uma entidade de notificação
Agora que a tabela de notificações foi criada, é hora de criar uma entidade para interagir com ela. Esta entidade representará uma única notificação na aplicação.
// src/Entity/Notification.php
namespace AppEntity;
use DoctrineORMMapping as ORM;
/**
* @ORMEntity(repositoryClass="AppRepositoryNotificationRepository")
*/
class Notification
{
/**
* @ORMId()
* @ORMGeneratedValue()
* @ORMColumn(type="integer")
*/
private $id;
/**
* @ORMColumn(type="integer")
*/
private $userId;
/**
* @ORMColumn(type="string", length=255)
*/
private $message;
/**
* @ORMColumn(type="datetime", nullable=true)
*/
private $readAt;
/**
* @ORMColumn(type="datetime")
*/
private $createdAt;
// getters and setters
}
Passo 3: Criando um serviço de notificação
Agora que temos uma entidade de notificação, precisamos criar um serviço para manipular notificações dentro da aplicação. Este serviço será responsável por criar, atualizar e carregar notificações do banco de dados.
// src/Service/NotificationService.php
namespace AppService;
use AppEntityNotification;
use DoctrineORMEntityManagerInterface;
class NotificationService
{
private $entityManager;
public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}
public function createNotification($userId, $message)
{
$notification = new Notification();
$notification->setUserId($userId);
$notification->setMessage($message);
$notification->setCreatedAt(new DateTime());
$this->entityManager->persist($notification);
$this->entityManager->flush();
return $notification;
}
public function markNotificationAsRead(Notification $notification)
{
$notification->setReadAt(new DateTime());
$this->entityManager->persist($notification);
$this->entityManager->flush();
}
public function loadNotificationsForUser($userId)
{
return $this->entityManager->getRepository(Notification::class)
->findBy(['userId' => $userId], ['createdAt' => 'DESC']);
}
}
Passo 4: Gerando notificações para eventos específicos
Agora que temos um serviço de notificações, precisamos gerar notificações para eventos específicos dentro da aplicação. Para isso, podemos adicionar chamadas para o serviço de notificações em locais específicos do código. Por exemplo, se quisermos notificar um usuário quando uma nova postagem for criada, podemos adicionar o seguinte código ao controlador responsável por gerenciar postagens:
// src/Controller/PostController.php
namespace AppController;
use AppServiceNotificationService;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentRoutingAnnotationRoute;
class PostController extends AbstractController
{
/**
* @Route("/post/create", name="post_create")
*/
public function create(NotificationService $notificationService)
{
// cria a postagem ...
// notifica o usuário
$notificationMessage = 'Uma nova postagem foi criada!';
$notificationService->createNotification($this->getUser()->getId(), $notificationMessage);
return $this->redirectToRoute('post_list');
}
// outras ações do controlador...
}
Passo 5: Exibindo notificações para usuários
Finalmente, precisamos exibir notificações para usuários na interface do usuário da aplicação. Para fazer isso, podemos criar um novo controlador para carregar notificações para o usuário atual e exibi-las em uma interface amigável.
// src/Controller/NotificationController.php
namespace AppController;
use AppServiceNotificationService;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentRoutingAnnotationRoute;
class NotificationController extends AbstractController
{
/**
* @Route("/notifications", name="notifications_list")
*/
public function list(NotificationService $notificationService)
{
// carrega as notificações para o usuário atual
$notifications = $notificationService->loadNotificationsForUser($this->getUser()->getId());
// marca notificações como lidas
foreach ($notifications as $notification) {
if (!$notification->getReadAt()) {
$notificationService->markNotificationAsRead($notification);
}
}
// exibe notificações na tela
return $this->render('notifications/list.html.twig', [
'notifications' => $notifications,
]);
}
}
Para exibir as notificações na interface do usuário, podemos criar uma nova página Twig e incluí-la no modelo de página em que queremos exibir as notificações.
Esperamos que este tutorial tenha ajudado você a entender como criar um sistema de notificações personalizado no Symfony. Com essas ferramentas, você pode manter seus usuários atualizados sobre eventos importantes em sua aplicação e melhorar a experiência do usuário.