Installation
composer require xlabs/inboxbundle
Add to config/bundles.php:
return [
// ...
XLabs\InboxBundle\XLabsInboxBundle::class => ['all' => true],
];
Database Migration Run the bundle’s migrations:
php bin/console doctrine:migrations:diff
php bin/console doctrine:migrations:migrate
The bundle provides default tables (inbox_messages, inbox_folders).
First Use Case
Inject the InboxManager service in a controller:
use XLabs\InboxBundle\Manager\InboxManager;
class UserController extends Controller {
public function __construct(private InboxManager $inboxManager) {}
public function showInbox() {
$messages = $this->inboxManager->getMessagesForUser($this->getUser());
return $this->render('inbox/index.html.twig', ['messages' => $messages]);
}
}
Twig Integration
Enable Twig extensions in config/packages/twig.yaml:
twig:
extensions:
- XLabs\InboxBundle\Twig\InboxExtension
Use in templates:
{% for message in inbox_messages %}
{{ message.subject }} ({{ message.createdAt|date('Y-m-d') }})
{% endfor %}
Message Management
$message = $this->inboxManager->createMessage(
$userId,
'New Task',
'Details here...',
['type' => 'task']
);
$this->inboxManager->markAsRead($message->getId());
$this->inboxManager->deleteMessage($message->getId());
$this->inboxManager->markMessagesAsRead([1, 2, 3]);
Folder System
$folder = $this->inboxManager->createFolder($userId, 'Archived');
$this->inboxManager->moveMessageToFolder($messageId, $folder->getId());
inbox, sent, archive) are auto-created on user registration.Event-Driven Extensions
Subscribe to events (e.g., MessageCreatedEvent):
// src/EventListener/MessageListener.php
class MessageListener implements MessageCreatedEventSubscriber {
public static function getSubscribedEvents() {
return [MessageCreatedEvent::NAME => 'onMessageCreated'];
}
public function onMessageCreated(MessageCreatedEvent $event) {
// Log, notify, or transform the message
}
}
API Integration
Use the InboxApi service for RESTful endpoints:
$messages = $this->inboxApi->getMessages($userId, ['limit' => 10]);
return $this->json($messages);
InboxType form for message creation:
$form = $this->createForm(InboxType::class, $message);
// src/Security/Voter/InboxVoter.php
class InboxVoter extends AbstractVoter {
protected function supports(string $attribute, $subject) {
return $attribute === 'VIEW_INBOX' && $subject instanceof User;
}
}
InboxSearch service for full-text queries:
$results = $this->inboxSearch->search('urgent', $userId);
User Context
getMessagesForUser().// src/EventListener/UserContextListener.php
class UserContextListener {
public function onKernelRequest(GetResponseEvent $event) {
$this->inboxManager->setCurrentUser($event->getRequest()->getUser());
}
}
Message Ownership
MessageOwnerChecker or use Symfony’s access control:
$this->denyAccessUnlessGranted('EDIT_MESSAGE', $message);
Performance with Large Inboxes
$messages = $this->inboxManager->getMessagesForUser($user, ['page' => 1, 'limit' => 20]);
Event Ordering
MessageCreatedEvent before validation).public static function getSubscribedEvents() {
return [MessageCreatedEvent::NAME => ['onMessageCreated', 100]]; // Higher priority
}
Default Folder IDs
1 = inbox, 2 = sent, 3 = archive). Override in config/packages/xlabs_inbox.yaml:
xlabs_inbox:
default_folders:
inbox: 100
sent: 101
archive: 102
Message TTL
xlabs_inbox:
message_ttl: 90 # days
Twig Debugging
php bin/console cache:clear
Custom Message Types
Extend the Message entity:
// src/Entity/CustomMessage.php
class CustomMessage extends AbstractMessage {
#[ORM\Column]
private string $customField;
}
Register in config/packages/xlabs_inbox.yaml:
xlabs_inbox:
message_classes:
custom: App\Entity\CustomMessage
Message Attachments
Use the AttachmentManager:
$attachment = $this->attachmentManager->addAttachment($message, '/path/to/file.pdf');
Webhook Notifications
Subscribe to MessageStatusChangedEvent:
public function onMessageStatusChanged(MessageStatusChangedEvent $event) {
if ($event->getNewStatus() === 'read') {
$this->httpClient->request('POST', 'https://api.example.com/webhook', [
'json' => ['message_id' => $event->getMessage()->getId()]
]);
}
}
Testing
Use the InboxTestCase base class:
class MyInboxTest extends InboxTestCase {
public function testMessageCreation() {
$message = $this->createMessage('Test', 'Content');
$this->assertEquals('Test', $message->getSubject());
}
}
How can I help you explore Laravel packages today?