Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 19 additions & 6 deletions src/DI/Pass/BusPass.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,17 @@ public function loadPassConfiguration(): void
$builder = $this->getContainerBuilder();
$config = $this->getConfig();

$defaultBusName = null;

// Iterate all buses
foreach ($config->bus as $name => $busConfig) {
$middlewares = [];

// Track the first bus as the default/fallback bus
if ($defaultBusName === null) {
$defaultBusName = $name;
}

$builder->addDefinition($this->prefix(sprintf('bus.%s.locator', $name)))
->setFactory(ContainerServiceHandlersLocator::class, [[]])
->setAutowired(false);
Expand Down Expand Up @@ -77,13 +84,14 @@ public function loadPassConfiguration(): void
->addSetup('setLogger', [$this->prefix('@logger.logger')]);
}

// Register message bus
// Register message bus - individual buses are NOT autowired for MessageBusInterface
// The RoutableMessageBus will be the autowired MessageBusInterface
$builder->addDefinition($this->prefix(sprintf('bus.%s.bus', $name)))
->setFactory($busConfig->class ?? SymfonyMessageBus::class, [$middlewares])
->setAutowired($busConfig->autowired ?? count($builder->findByTag(MessengerExtension::BUS_TAG)) === 0)
->setAutowired(false)
->setTags([MessengerExtension::BUS_TAG => $name]);

// Register bus wrapper
// Register bus wrapper (these can still be autowired for their specific types)
if (isset($busConfig->wrapper) || isset(self::BUS_WRAPPERS[$name])) {
$builder->addDefinition($this->prefix(sprintf('bus.%s.wrapper', $name)))
->setFactory($busConfig->wrapper ?? self::BUS_WRAPPERS[$name], [$this->prefix(sprintf('@bus.%s.bus', $name))]);
Expand All @@ -95,10 +103,15 @@ public function loadPassConfiguration(): void
->setFactory(NetteContainer::class)
->setAutowired(false);

// Register routable bus (for CLI)
// Register routable bus as the default autowired MessageBusInterface
// This ensures SyncTransport respects BusNameStamp when routing messages (Closes #16)
// The fallback bus is used when no BusNameStamp is present
$builder->addDefinition($this->prefix('bus.routable'))
->setFactory(RoutableMessageBus::class, [$this->prefix('@bus.container')]) // @TODO fallbackBus
->setAutowired(false);
->setFactory(RoutableMessageBus::class, [
$this->prefix('@bus.container'),
$defaultBusName !== null ? $this->prefix(sprintf('@bus.%s.bus', $defaultBusName)) : null,
])
->setAutowired(true);

// Register bus registry
$builder->addDefinition($this->prefix('busRegistry'))
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# Test for issue #16: SyncTransport should respect BusNameStamp
# https://github.com/contributte/messenger/issues/16
#
# When dispatching a message to eventBus (allowNoHandlers: true) via sync transport,
# the SyncTransport should use eventBus middleware, not the default messageBus middleware.
#
# This test currently FAILS because SyncTransport ignores BusNameStamp and uses
# the default bus middleware (messageBus with allowNoHandlers: false).

input:
config:
extensions:
messenger: Contributte\Messenger\DI\MessengerExtension()

messenger:
bus:
messageBus:
allowNoHandlers: false
eventBus:
allowNoHandlers: true

transport:
sync:
dsn: sync://

routing:
Tests\Mocks\Message\EventMessage: [sync]

dispatch:
bus: eventBus
message: Tests\Mocks\Message\EventMessage("test-event")

output:
# Expected: Message should be sent and received without error
# because eventBus has allowNoHandlers: true
logger:
- level: info
message: 'Sending message {class} with {alias} sender using {sender}'
context:
class: Tests\Mocks\Message\EventMessage
alias: sync
sender: 'Symfony\Component\Messenger\Transport\Sync\SyncTransport'

- level: info
message: 'Received message {class}'
context:
class: Tests\Mocks\Message\EventMessage

- level: info
message: 'No handler for message {class}'
context:
class: Tests\Mocks\Message\EventMessage
18 changes: 18 additions & 0 deletions tests/Mocks/Message/EventMessage.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php declare(strict_types = 1);

namespace Tests\Mocks\Message;

/**
* Event message without a handler - used for testing allowNoHandlers on eventBus
*/
final class EventMessage
{

public string $text;

public function __construct(string $text)
{
$this->text = $text;
}

}