Installation
Add the bundle to your composer.json:
composer require bisonlab/sakonnin-bundle
Enable it in config/bundles.php:
return [
// ...
BisonLab\SakonninBundle\SakonninBundle::class => ['all' => true],
];
Basic Configuration Publish the default config:
php bin/console sakonnin:install
Review config/packages/sakonnin.yaml for message handlers, callbacks, and routing.
First Use Case: Logging an Email
Inject the SakonninManager and log a message:
use BisonLab\SakonninBundle\Manager\SakonninManager;
public function someAction(SakonninManager $sakonnin)
{
$sakonnin->logMessage([
'type' => 'email',
'subject' => 'Order Confirmation',
'body' => 'Your order #12345 is confirmed.',
'context' => [
'system' => 'ecommerce',
'object_name' => 'order',
'external_id' => '12345',
],
]);
}
Message Handling
SakonninManager to log emails, SMS, or internal PMs with metadata (e.g., context for entity linking).
$sakonnin->logMessage([
'type' => 'sms',
'content' => 'Alert: Low stock!',
'context' => ['system' => 'inventory', 'external_id' => 'product_42'],
]);
Callbacks & Replies
config/packages/sakonnin.yaml to trigger actions on messages (e.g., forward emails with "ERROR" to SMS).
sakonnin:
callbacks:
email:
- { action: 'forward_to_sms', condition: { subject: '/ERROR/i' } }
SakonninManager::replyToMessage() to generate responses programmatically:
$reply = $sakonnin->replyToMessage($messageId, 'Support team replied: ...');
Context-Based Routing
context:
$context = ['system' => 'support', 'object_name' => 'ticket', 'external_id' => 'T-1001'];
$sakonnin->logMessage(['type' => 'pm', 'body' => 'User complaint', 'context' => $context]);
$messages = $sakonnin->getMessagesByContext(['system' => 'support']);
kernel.exception to log errors).
// src/EventListener/ErrorLogger.php
public function onKernelException(GetResponseForExceptionEvent $event)
{
$sakonnin->logMessage([
'type' => 'error',
'body' => $event->getThrowable()->getMessage(),
'context' => ['system' => 'app', 'external_id' => uniqid()],
]);
}
// src/Controller/MessageController.php
public function getMessages(SakonninManager $sakonnin)
{
return $this->json($sakonnin->getMessages(['type' => 'email']));
}
Context Precision
context queries (e.g., system: '*') may return unintended messages. Always specify object_name or external_id where possible.var_dump($sakonnin->getMessages(['context' => [...]])) to verify context matching.Callback Order
sakonnin.yaml execute in declaration order. Reorder or use priorities (e.g., priority: 100) for critical actions.callbacks:
email:
- { action: 'archive', priority: 200 } # Runs after 'forward_to_sms'
- { action: 'forward_to_sms', condition: { subject: '/ERROR/i' } }
Message Type Validation
type values (e.g., 'chat') will silently fail. Extend the bundle or validate inputs:
$allowedTypes = ['email', 'sms', 'pm', 'error'];
if (!in_array($message['type'], $allowedTypes)) {
throw new \InvalidArgumentException("Unsupported message type");
}
sakonnin.yaml:
debug: true # Logs callback execution and message routing
/_profiler) to inspect database queries for context-based lookups.Custom Handlers
BisonLab\SakonninBundle\Handler\MessageHandlerInterface:
// src/Handler/CustomHandler.php
class CustomHandler implements MessageHandlerInterface
{
public function handle(array $message): void
{
// Logic for 'custom_type' messages
}
}
services.yaml:
services:
App\Handler\CustomHandler:
tags: [sakonnin.handler]
Dynamic Context
BisonLab\SakonninBundle\Context\ContextResolver:
// src/Context/CustomResolver.php
class CustomResolver extends ContextResolver
{
protected function resolveContext(array $message): array
{
$context = parent::resolveContext($message);
$context['custom_field'] = 'value'; // Add dynamic fields
return $context;
}
}
services.yaml:
BisonLab\SakonninBundle\Context\ContextResolver: '@App\Context\CustomResolver'
File Handling
MessageHandlerInterface and integrating with Symfony’s Filesystem or UploadedFile components.email, sms, and pm. Disable unused ones in sakonnin.yaml:
handlers:
email: false # Disable if not using email messages
twig configuration:
twig:
templates:
reply: 'bundles/sakonnin/email/reply.html.twig'
How can I help you explore Laravel packages today?