3slab/vdm-library-doctrine-transport-bundle
Install Dependencies
composer require 3slab/vdm-library-doctrine-transport-bundle symfony/messenger symfony/orm-pack
(or doctrine/mongodb-odm-bundle for ODM).
Configure Messenger Transport
Add to config/packages/messenger.yaml:
framework:
messenger:
transports:
vdm_transport:
dsn: 'vdm+doctrine_orm://default'
options:
default_entity: 'App\Entity\YourEntity'
First Use Case Dispatch a message to persist an entity:
use Vdm\Library\DoctrineTransportBundle\Message\VdmMessage;
$message = new VdmMessage(
'App\Entity\YourEntity',
['id' => '123', 'name' => 'Test']
);
$this->messageBus->dispatch($message);
Entity Persistence via Messages
Use VdmMessage to trigger CRUD operations:
// Create
$this->messageBus->dispatch(new VdmMessage('App\Entity\User', ['name' => 'John']));
// Update
$this->messageBus->dispatch(new VdmMessage('App\Entity\User', ['id' => 1, 'name' => 'Updated']));
// Delete
$this->messageBus->dispatch(new VdmMessage('App\Entity\User', ['id' => 1, '__action__' => 'DELETE']));
Custom Selectors Override default entity selection logic:
options:
entities:
App\Entity\Order:
selector: 'orderNumber' # Uses this field instead of 'id'
Async Processing
Combine with Symfony Messenger’s async transports (e.g., doctrine or amqp):
transports:
async_vdm:
dsn: 'vdm+doctrine_orm://default'
retry_strategy:
max_retries: 3
router:
type: 'single'
VdmMessage for pre/post-processing:
public function __invoke(VdmMessage $message, DispatcherInterface $dispatcher)
{
if ($message->getEntityClass() === User::class) {
$dispatcher->dispatch(new UserEvent($message->getData()));
}
}
postPersist, postUpdate, etc., to sync with other systems.DSN Format Strictness
vdm+doctrine_orm://) throws RuntimeException.vdm+doctrine_[orm|odm]://[connection].Entity Not Found
default_entity is set but the entity doesn’t exist, the transport fails silently.bootstrap.php or a service compiler pass.Transaction Handling
DoctrineExecutor with explicit transactions if needed:
options:
doctrine_executor: 'app.custom_doctrine_executor'
ODM vs. ORM Quirks
_id field for selection; ORM defaults to id.selector explicitly for ODM entities.config/packages/dev/messenger.yaml:
framework:
messenger:
transports:
vdm_transport:
dsn: 'vdm+doctrine_orm://default'
options:
logger: true # Logs all messages
dump() to inspect resolved options:
$container->get('messenger.transport.vdm_transport')->getOptions();
DefaultDoctrineExecutor to log operations:
class CustomExecutor extends DefaultDoctrineExecutor
{
public function execute(VdmMessage $message): void
{
\Log::debug('Executing VDM message', ['entity' => $message->getEntityClass()]);
parent::execute($message);
}
}
Custom Message Handlers Create a handler for specific message types:
class CustomVdmHandler implements MessageHandlerInterface
{
public function __invoke(VdmMessage $message)
{
if ($message->getEntityClass() === SpecialEntity::class) {
// Custom logic
}
}
}
Register in services.yaml:
services:
App\MessageHandler\CustomVdmHandler:
tags:
- { name: 'messenger.message_handler', handles: 'Vdm\Library\DoctrineTransportBundle\Message\VdmMessage' }
Dynamic Entity Mapping Use a compiler pass to dynamically configure entities:
class VdmEntityPass implements CompilerPassInterface
{
public function process(ContainerBuilder $container)
{
$definition = $container->getDefinition('messenger.transport.vdm_transport');
$definition->replaceArgument(
0,
array_merge($definition->getArgument(0), ['App\Entity\DynamicEntity' => 'dynamicId'])
);
}
}
Bulk Operations Process multiple entities in a single message:
$message = new VdmMessage('App\Entity\Product', [
['id' => 1, 'price' => 10.99],
['id' => 2, 'price' => 20.99],
'__action__' => 'UPDATE'
]);
Note: Requires custom executor logic to handle arrays.
How can I help you explore Laravel packages today?