Installation:
composer require cunningsoft/chat-bundle:0.5.*
config/bundles.php (Symfony 4+):
return [
// ...
Cunningsoft\ChatBundle\CunningsoftChatBundle::class => ['all' => true],
Knp\Bundle\TimeBundle\KnpTimeBundle::class => ['all' => true],
];
AppKernel.php as shown in the README.Configure Doctrine:
User entity implements AuthorInterface:
use Cunningsoft\ChatBundle\Entity\AuthorInterface;
class User implements AuthorInterface { ... }
User entity in config/packages/doctrine.yaml (Symfony 4+):
doctrine:
orm:
resolve_target_entities:
Cunningsoft\ChatBundle\Entity\AuthorInterface: App\Entity\User
php bin/console doctrine:migrations:diff
php bin/console doctrine:migrations:migrate
Basic Setup:
config/packages/cunningsoft_chat.yaml (Symfony 4+):
cunningsoft_chat:
driver: doctrine # or 'mongodb' if using MongoDB
model:
message: App\Entity\Message
room: App\Entity\Room
Message and Room entity (see entity templates).First Use Case:
use Cunningsoft\ChatBundle\Entity\Room;
use Cunningsoft\ChatBundle\Manager\RoomManager;
$roomManager = $this->get('cunningsoft_chat.room_manager');
$room = $roomManager->createRoom('General Chat');
use Cunningsoft\ChatBundle\Entity\Message;
use Cunningsoft\ChatBundle\Manager\MessageManager;
$messageManager = $this->get('cunningsoft_chat.message_manager');
$message = $messageManager->createMessage($room, $user, 'Hello, world!');
$messageManager->saveMessage($message);
RoomManager to create dynamic or static rooms. Example:
$roomManager = $container->get('cunningsoft_chat.room_manager');
$room = $roomManager->createRoom('Support', ['is_public' => true]);
$parentRoom = $roomManager->findRoomById(1);
$childRoom = $roomManager->createRoom('Subtopic', ['parent' => $parentRoom]);
is_private, moderated) via room options:
# config/packages/cunningsoft_chat.yaml
cunningsoft_chat:
room_options:
default:
is_private: false
max_users: 100
MessageManager for CRUD operations:
$message = $messageManager->createMessage($room, $user, 'Content');
$messageManager->saveMessage($message);
chat.message.sent or chat.message.edited events:
// src/EventListener/ChatListener.php
use Cunningsoft\ChatBundle\Event\MessageEvent;
class ChatListener {
public function onMessageSent(MessageEvent $event) {
$message = $event->getMessage();
// Log, notify, or process the message
}
}
Register the listener in config/services.yaml:
services:
App\EventListener\ChatListener:
tags:
- { name: kernel.event_listener, event: chat.message.sent, method: onMessageSent }
TypingManager to show when users are typing:
$typingManager = $container->get('cunningsoft_chat.typing_manager');
$typingManager->userIsTyping($user, $room);
UserManager:
$userManager = $container->get('cunningsoft_chat.user_manager');
$userManager->setUserOnline($user);
// src/Controller/ChatController.php
use Cunningsoft\ChatBundle\Entity\Room;
use Symfony\Component\HttpFoundation\JsonResponse;
class ChatController {
public function getRoomMessages(Room $room) {
$messages = $this->get('cunningsoft_chat.message_manager')->findMessages($room);
return new JsonResponse($messages);
}
}
# config/packages/mercure.yaml
mercure:
hubs:
default:
url: '%env(MERCURE_URL)%'
public_id: 'https://%env(MERCURE_PUBLIC_URL)%/.well-known/mercure'
Publish updates in a listener:
use Symfony\Component\Mercure\Update;
use Symfony\Component\Mercure\HubInterface;
public function onMessageSent(MessageEvent $event, HubInterface $hub) {
$update = new Update(
'https://example.com/chat/' . $event->getMessage()->getRoom()->getId(),
json_encode($event->getMessage())
);
$hub->publish($update);
}
$qb = $messageManager->createMessageQueryBuilder('m')
->where('m.room = :room')
->andWhere('m.createdAt > :date')
->setParameter('room', $room)
->setParameter('date', new \DateTime('-1 day'));
$messages = $qb->getQuery()->getResult();
// Add to Message entity
use Gedmo\Mapping\Annotation as Gedmo;
/**
* @Gedmo\Indexed
*/
private $content;
{% extends 'base.html.twig' %}
{% block body %}
<div id="chat-container">
{% for message in messages %}
<div class="message">
<strong>{{ message.author.username }}</strong>: {{ message.content }}
<small>{{ message.createdAt|date('H:i') }}</small>
</div>
{% endfor %}
</div>
{% endblock %}
return $this->render('chat/index.html.twig', [
'messages' => $messageManager->findMessages($room),
]);
ChatBundle's services in tests:
public function testMessageCreation() {
$room = $this->createMock(Room::class);
$user = $this->createMock(User::class);
$messageManager = $this->get('cunningsoft_chat.message_manager');
$message = $messageManager->createMessage($room, $user, 'Test');
$this->assertInstanceOf(Message::class, $message);
}
$eventDispatcher = $this->get('event_dispatcher');
$event = new MessageEvent($message);
$eventDispatcher->dispatch($event, 'chat.message.sent');
$messages = $messageManager->findMessages($room, 10, 0); // 10 items, offset 0
$
How can I help you explore Laravel packages today?