Skip to content

Commit

Permalink
Middlewares are now like in Symfony + can disable default middlewares
Browse files Browse the repository at this point in the history
  • Loading branch information
JanMikes authored and f3l1x committed Aug 7, 2023
1 parent f19020b commit f99f6aa
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 19 deletions.
3 changes: 3 additions & 0 deletions .docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,9 @@ messenger:
# Defines buses, default one are messageBus, queryBus and commandBus.
bus:
messageBus:
# To disable default middlewares stack (see https://symfony.com/doc/current/messenger.html#middleware)
defaultMiddlewares: false
# Define middlewares just for this bus.
middlewares:
#- LoggerMiddleware()
Expand Down
2 changes: 2 additions & 0 deletions src/DI/MessengerExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ public function getConfigSchema(): Schema
]),
'bus' => Expect::arrayOf(
Expect::structure([
'defaultMiddlewares' => Expect::bool(true),
'middlewares' => Expect::arrayOf($expectService),
'allowNoHandlers' => Expect::bool(false),
'allowNoSenders' => Expect::bool(true),
Expand All @@ -85,6 +86,7 @@ public function getConfigSchema(): Schema
Expect::string()->required(),
)->default(ArrayHash::from([
'messageBus' => [
'defaultMiddlewares' => true,
'middlewares' => [],
'class' => null,
'autowired' => true,
Expand Down
42 changes: 26 additions & 16 deletions src/DI/Pass/BusPass.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
use Nette\DI\Definitions\ServiceDefinition;
use Symfony\Component\Messenger\MessageBus as SymfonyMessageBus;
use Symfony\Component\Messenger\Middleware\AddBusNameStampMiddleware;
use Symfony\Component\Messenger\Middleware\DispatchAfterCurrentBusMiddleware;
use Symfony\Component\Messenger\Middleware\FailedMessageProcessingMiddleware;
use Symfony\Component\Messenger\Middleware\HandleMessageMiddleware;
use Symfony\Component\Messenger\Middleware\SendMessageMiddleware;
Expand Down Expand Up @@ -43,29 +44,38 @@ public function loadPassConfiguration(): void
->setFactory(ContainerServiceHandlersLocator::class, [[]])
->setAutowired(false);

if ($busConfig->defaultMiddlewares === true) {
$middlewares[] = $builder->addDefinition($this->prefix(sprintf('bus.%s.middleware.busStampMiddleware', $name)))
->setFactory(AddBusNameStampMiddleware::class, [$name])
->setAutowired(false);

$middlewares[] = $builder->addDefinition($this->prefix(sprintf('bus.%s.middleware.dispatchAfterCurrentBusMiddleware', $name)))
->setFactory(DispatchAfterCurrentBusMiddleware::class)
->setAutowired(false);

$middlewares[] = $builder->addDefinition($this->prefix(sprintf('bus.%s.middleware.failedMessageProcessingMiddleware', $name)))
->setFactory(FailedMessageProcessingMiddleware::class)
->setAutowired(false);
}

// Custom middlewares
foreach ($busConfig->middlewares as $index => $middlewareConfig) {
$middlewares[] = $builder->addDefinition($this->prefix(sprintf('bus.%s.middleware.custom%sMiddleware', $name, $index)))
->setFactory($middlewareConfig)
->setAutowired(false);
}

$middlewares[] = $builder->addDefinition($this->prefix(sprintf('bus.%s.middleware.busStampMiddleware', $name)))
->setFactory(AddBusNameStampMiddleware::class, [$name])
->setAutowired(false);

$middlewares[] = $builder->addDefinition($this->prefix(sprintf('bus.%s.middleware.failedMessageProcessingMiddleware', $name)))
->setFactory(FailedMessageProcessingMiddleware::class)
->setAutowired(false);

$middlewares[] = $builder->addDefinition($this->prefix(sprintf('bus.%s.middleware.sendMiddleware', $name)))
->setFactory(SendMessageMiddleware::class, [$this->prefix('@routing.locator'), $this->prefix('@event.dispatcher'), $busConfig->allowNoSenders])
->setAutowired(false)
->addSetup('setLogger', [$this->prefix('@logger.logger')]);
if ($busConfig->defaultMiddlewares === true) {
$middlewares[] = $builder->addDefinition($this->prefix(sprintf('bus.%s.middleware.sendMiddleware', $name)))
->setFactory(SendMessageMiddleware::class, [$this->prefix('@routing.locator'), $this->prefix('@event.dispatcher'), $busConfig->allowNoSenders])
->setAutowired(false)
->addSetup('setLogger', [$this->prefix('@logger.logger')]);

$middlewares[] = $builder->addDefinition($this->prefix(sprintf('bus.%s.middleware.handleMiddleware', $name)))
->setFactory(HandleMessageMiddleware::class, [$this->prefix(sprintf('@bus.%s.locator', $name)), $busConfig->allowNoHandlers])
->setAutowired(false)
->addSetup('setLogger', [$this->prefix('@logger.logger')]);
$middlewares[] = $builder->addDefinition($this->prefix(sprintf('bus.%s.middleware.handleMiddleware', $name)))
->setFactory(HandleMessageMiddleware::class, [$this->prefix(sprintf('@bus.%s.locator', $name)), $busConfig->allowNoHandlers])
->setAutowired(false)
->addSetup('setLogger', [$this->prefix('@logger.logger')]);
}

$builder->addDefinition($this->prefix(sprintf('bus.%s.bus', $name)))
->setFactory($busConfig->class ?? SymfonyMessageBus::class, [$middlewares])
Expand Down
49 changes: 47 additions & 2 deletions tests/Cases/DI/MessengerExtension.bus.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ Toolkit::test(function (): void {
->build();

Assert::count(3, $container->findByType(MessageBus::class));
Assert::count(3 * 4, $container->findByType(MiddlewareInterface::class));
Assert::count(3 * 5, $container->findByType(MiddlewareInterface::class));
});

// Buses with middlewares
Expand All @@ -57,7 +57,52 @@ Toolkit::test(function (): void {
->build();

Assert::count(1, $container->findByType(MessageBus::class));
Assert::count(7, $container->findByType(MiddlewareInterface::class));
Assert::count(8, $container->findByType(MiddlewareInterface::class));
});

// Default middlewares disabled
Toolkit::test(function (): void {
$container = Container::of()
->withDefaults()
->withCompiler(function (Compiler $compiler): void {
$compiler->addConfig(Helpers::neon(<<<'NEON'
messenger:
bus:
messageBus:
defaultMiddlewares: false
NEON
));
})
->build();

Assert::count(1, $container->findByType(MessageBus::class));
Assert::count(0, $container->findByType(MiddlewareInterface::class));
});

// Default middlewares disabled, with custom middlewares registered
Toolkit::test(function (): void {
$container = Container::of()
->withDefaults()
->withCompiler(function (Compiler $compiler): void {
$compiler->addConfig(Helpers::neon(<<<'NEON'
messenger:
bus:
commandBus:
messageBus:
defaultMiddlewares: false
middlewares:
dummy1: Tests\Mocks\Middleware\SimpleMiddleware
dummy2: @middleware
services:
middleware: Tests\Mocks\Middleware\SimpleMiddleware
NEON
));
})
->build();

Assert::count(2, $container->findByType(MessageBus::class));
Assert::count(5 + 3, $container->findByType(MiddlewareInterface::class));
});

// Bus container
Expand Down
2 changes: 1 addition & 1 deletion tests/Cases/DI/MessengerExtension.transport.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ Toolkit::test(function (): void {
->build();

Assert::count(1, $container->findByType(SerializerInterface::class));
Assert::count(4, $container->findByType(MiddlewareInterface::class));
Assert::count(5, $container->findByType(MiddlewareInterface::class));
Assert::count(5, $container->findByType(TransportFactoryInterface::class));
Assert::count(0, $container->findByType(TransportInterface::class));
});
Expand Down

0 comments on commit f99f6aa

Please sign in to comment.