romanfedorskij / message-bus-spiral
Message bus adapter for Spiral Framework
Package info
github.com/wolfcharaa/message-bus-spiral
pkg:composer/romanfedorskij/message-bus-spiral
Requires
- php: ^8.3
- nyholm/psr7: ^1.8
- romanfedorskij/message-bus: ^5.0
- spiral/framework: ^3.16
- spiral/roadrunner-bridge: ^3.8
Requires (Dev)
- phpunit/phpunit: ^10.5 || ^11.0 || ^12.0
README
romanfedorskij/message-bus-spiral — адаптер Spiral Framework для romanfedorskij/message-bus v4.
Поддерживаемая версия Spiral Framework: ^3.16.
Пакет не содержит отдельного registry builder. В v4 связи message -> action компилируются основным message-bus, а Spiral-пакет подключает:
Spiral\Tokenizerlistener для поиска классов с attributes;- compiler listener, который пишет compiled registry в runtime-файл;
- Spiral DI resolver;
- Spiral invoker для handler/middleware;
- Spiral Queue provider;
- Spiral Queue job для выполнения serialized envelope.
Установка
composer require romanfedorskij/message-bus-spiral
Конфигурация
В приложении нужно указать путь к compiled registry. Listener создаст этот файл при boot приложения:
<?php declare(strict_types=1); use Wolfcharaa\MessageBus\Flow\FlowDefinition; use Wolfcharaa\MessageBus\Spiral\Application\Job\QueueHandlerJob; return [ 'registryFile' => directory('runtime') . 'cache/message_bus_registry.php', 'queueJob' => QueueHandlerJob::class, 'runtimePlan' => true, 'flows' => [ FlowDefinition::sync('default'), ], ];
Файл подключается как message_bus config.
Discovery через Spiral Tokenizer
MessageBusBootloader регистрирует listener в TokenizerListenerBootloader.
Listener получает классы с attributes:
CommandHandler;QueryHandler;EventSubscriber;MessageAlias.
После обхода проекта listener вызывает core MessageRegistryCompiler и сохраняет результат в registryFile.
Runtime MessageBus читает уже compiled registry через CompiledMessageRegistry::fromFile().
Runtime plan для long-running Spiral
После чтения compiled registry адаптер собирает RuntimePlanRegistry в памяти процесса:
- заранее подготавливает карту
bindingId -> plan; - заранее сортирует bindings по priority;
- заранее объединяет
flow middleware + binding middleware; - заранее объединяет
flow delivery + binding delivery; - автоматически подменяет default sync/async strategies на runtime-plan strategies.
Runtime plan хранит только class-string и immutable definition-данные. Объекты action и middleware не кешируются адаптером: их продолжает создавать Spiral DI в текущем scope. Это сохраняет корректную работу request/auth scope и подмен интерфейсов в long-running RoadRunner worker.
Flow для Spiral Queue
transport используется как имя Spiral queue connection.
queue используется как queue name внутри options.
use Wolfcharaa\MessageBus\Flow\FlowDefinition; use Wolfcharaa\MessageBus\Flow\FlowRegistry; $flows = new FlowRegistry( FlowDefinition::sync('default'), FlowDefinition::async('notifications') ->transport('roadrunner', 'notifications'), );
Async binding обязан иметь стабильный bindingId.
Worker
Producer сохраняет в Spiral Queue переносимый array payload.
Worker восстанавливает SerializedEnvelope и вызывает core worker:
\Wolfcharaa\MessageBus\Spiral\Application\Job\QueueHandlerJob::class
PHP serialize() не используется.
Примеры
- Быстрое подключение bootloader и config
- Command handler и compiled registry
- Async flow через Spiral Queue
- Runtime plan в long-running процессе
Тесты
composer test