diff --git a/composer.json b/composer.json index 7bbb0f0..70b5979 100644 --- a/composer.json +++ b/composer.json @@ -8,13 +8,15 @@ "doctrine/dbal": "^3.3", "doctrine/doctrine-bundle": "^2.5", "doctrine/orm": "^2.11", + "psr/container": "^1.0 || ^2.0", "symfony/config": "^5.4 || ^6.0", "symfony/dependency-injection": "^5.4 || ^6.0", "symfony/doctrine-bridge": "^5.4 || ^6.0", "symfony/framework-bundle": "^5.4 || ^6.0", "symfony/http-kernel": "^5.4 || ^6.0", "symfony/lock": "^5.4 || ^6.0", - "symfony/messenger": "^5.4 || ^6.0" + "symfony/messenger": "^5.4 || ^6.0", + "symfony/service-contracts": "^1.0 || ^2.0 || ^3.0" }, "require-dev": { "coduo/php-matcher": "^6.0", diff --git a/config/services.php b/config/services.php index f77da90..ffbb35a 100644 --- a/config/services.php +++ b/config/services.php @@ -13,12 +13,12 @@ $services->set('sulu_messenger.doctrine_flush_middleware') ->class(DoctrineFlushMiddleware::class) - ->args([service('doctrine.orm.entity_manager')]); + ->tag('container.service_subscriber'); $services->set('sulu_messenger.unpack_exception_middleware') ->class(UnpackExceptionMiddleware::class); $services->set('sulu_messenger.lock_middleware') ->class(LockMiddleware::class) - ->args([service('lock.factory')]); + ->tag('container.service_subscriber'); }; diff --git a/src/Infrastructure/Symfony/Messenger/FlushMiddleware/DoctrineFlushMiddleware.php b/src/Infrastructure/Symfony/Messenger/FlushMiddleware/DoctrineFlushMiddleware.php index 442d9d0..b2d19a1 100644 --- a/src/Infrastructure/Symfony/Messenger/FlushMiddleware/DoctrineFlushMiddleware.php +++ b/src/Infrastructure/Symfony/Messenger/FlushMiddleware/DoctrineFlushMiddleware.php @@ -5,15 +5,16 @@ namespace Sulu\Messenger\Infrastructure\Symfony\Messenger\FlushMiddleware; use Doctrine\ORM\EntityManagerInterface; +use Psr\Container\ContainerInterface; use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Middleware\MiddlewareInterface; use Symfony\Component\Messenger\Middleware\StackInterface; +use Symfony\Contracts\Service\ServiceSubscriberInterface; -class DoctrineFlushMiddleware implements MiddlewareInterface +class DoctrineFlushMiddleware implements MiddlewareInterface, ServiceSubscriberInterface { - public function __construct( - private EntityManagerInterface $entityManager, - ) { + public function __construct(private ContainerInterface $container) + { } public function handle(Envelope $envelope, StackInterface $stack): Envelope @@ -22,9 +23,16 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope // flush unit-of-work to the database after the root message was handled successfully if (!empty($envelope->all(EnableFlushStamp::class))) { - $this->entityManager->flush(); + $this->container->get('doctrine.orm.entity_manager')->flush(); } return $envelope; } + + public static function getSubscribedServices(): array + { + return [ + 'doctrine.orm.entity_manager' => EntityManagerInterface::class, + ]; + } } diff --git a/src/Infrastructure/Symfony/Messenger/LockMiddleware/LockMiddleware.php b/src/Infrastructure/Symfony/Messenger/LockMiddleware/LockMiddleware.php index d35cf7b..1d8e48c 100644 --- a/src/Infrastructure/Symfony/Messenger/LockMiddleware/LockMiddleware.php +++ b/src/Infrastructure/Symfony/Messenger/LockMiddleware/LockMiddleware.php @@ -4,16 +4,17 @@ namespace Sulu\Messenger\Infrastructure\Symfony\Messenger\LockMiddleware; +use Psr\Container\ContainerInterface; use Symfony\Component\Lock\LockFactory; use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Middleware\MiddlewareInterface; use Symfony\Component\Messenger\Middleware\StackInterface; +use Symfony\Contracts\Service\ServiceSubscriberInterface; -class LockMiddleware implements MiddlewareInterface +class LockMiddleware implements MiddlewareInterface, ServiceSubscriberInterface { - public function __construct( - private LockFactory $lockFactory, - ) { + public function __construct(private ContainerInterface $container) + { } public function handle(Envelope $envelope, StackInterface $stack): Envelope @@ -25,7 +26,7 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope $lockStamps = $envelope->all(LockStamp::class); foreach ($lockStamps as $lockStamp) { - $lock = $this->lockFactory->createLock( + $lock = $this->container->get('lock.factory')->createLock( $lockStamp->getResource(), $lockStamp->getTtl(), $lockStamp->getAutoRelease(), @@ -44,4 +45,11 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope return $envelope; } + + public static function getSubscribedServices(): array + { + return [ + 'lock.factory' => LockFactory::class, + ]; + } } diff --git a/tests/Unit/Infrastructure/Symfony/Messenger/FlushMiddleware/DoctrineFlushMiddlewareTest.php b/tests/Unit/Infrastructure/Symfony/Messenger/FlushMiddleware/DoctrineFlushMiddlewareTest.php index 3e95d93..391c959 100644 --- a/tests/Unit/Infrastructure/Symfony/Messenger/FlushMiddleware/DoctrineFlushMiddlewareTest.php +++ b/tests/Unit/Infrastructure/Symfony/Messenger/FlushMiddleware/DoctrineFlushMiddlewareTest.php @@ -11,6 +11,7 @@ use stdClass; use Sulu\Messenger\Infrastructure\Symfony\Messenger\FlushMiddleware\DoctrineFlushMiddleware; use Sulu\Messenger\Infrastructure\Symfony\Messenger\FlushMiddleware\EnableFlushStamp; +use Symfony\Component\DependencyInjection\Container; use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Middleware\StackMiddleware; @@ -31,8 +32,11 @@ class DoctrineFlushMiddlewareTest extends TestCase protected function setUp(): void { $this->entityManager = $this->prophesize(EntityManagerInterface::class); + $container = new Container(); + $container->set('doctrine.orm.entity_manager', $this->entityManager->reveal()); + $this->middleware = new DoctrineFlushMiddleware( - $this->entityManager->reveal(), + $container, ); } @@ -65,6 +69,16 @@ public function testHandleWithStamp(): void ); } + public function testGetSubscribedServices(): void + { + $this->assertSame( + [ + 'doctrine.orm.entity_manager' => EntityManagerInterface::class, + ], + $this->middleware->getSubscribedServices(), + ); + } + private function createEnvelope(): Envelope { return new Envelope(new stdClass()); diff --git a/tests/Unit/Infrastructure/Symfony/Messenger/LockMiddleware/LockMiddlewareTest.php b/tests/Unit/Infrastructure/Symfony/Messenger/LockMiddleware/LockMiddlewareTest.php index 82e5cba..930ff5e 100644 --- a/tests/Unit/Infrastructure/Symfony/Messenger/LockMiddleware/LockMiddlewareTest.php +++ b/tests/Unit/Infrastructure/Symfony/Messenger/LockMiddleware/LockMiddlewareTest.php @@ -11,6 +11,7 @@ use stdClass; use Sulu\Messenger\Infrastructure\Symfony\Messenger\LockMiddleware\LockMiddleware; use Sulu\Messenger\Infrastructure\Symfony\Messenger\LockMiddleware\LockStamp; +use Symfony\Component\DependencyInjection\Container; use Symfony\Component\Lock\LockFactory; use Symfony\Component\Lock\LockInterface; use Symfony\Component\Messenger\Envelope; @@ -33,8 +34,11 @@ class LockMiddlewareTest extends TestCase protected function setUp(): void { $this->lockFactory = $this->prophesize(LockFactory::class); + $container = new Container(); + $container->set('lock.factory', $this->lockFactory->reveal()); + $this->middleware = new LockMiddleware( - $this->lockFactory->reveal(), + $container, ); } @@ -74,6 +78,16 @@ public function testHandleWithStamp(): void ); } + public function testGetSubscribedServices(): void + { + $this->assertSame( + [ + 'lock.factory' => LockFactory::class, + ], + $this->middleware->getSubscribedServices(), + ); + } + private function createEnvelope(): Envelope { return new Envelope(new stdClass());