From 6ad46eeb1a302cf8ac71225f668caa11fd2c0472 Mon Sep 17 00:00:00 2001 From: Grzegorz Sadowski Date: Fri, 2 Feb 2024 12:09:40 +0100 Subject: [PATCH] [Shop] Introduce BC solution for deprecated and overwritten email managers --- .../ReplaceEmailManagersPass.php | 75 +++++++++++++++++++ .../Resources/config/services/controller.xml | 2 +- .../Resources/config/services/email.xml | 14 +++- .../Resources/config/services/listeners.xml | 2 +- .../ReplaceEmailManagersPassTest.php | 62 +++++++++++++++ 5 files changed, 151 insertions(+), 4 deletions(-) create mode 100644 src/Sylius/Bundle/ShopBundle/DependencyInjection/Compiler/BackwardsCompatibility/ReplaceEmailManagersPass.php create mode 100644 src/Sylius/Bundle/ShopBundle/Tests/DependencyInjection/Compiler/BackwardsCompatibility/ReplaceEmailManagersPassTest.php diff --git a/src/Sylius/Bundle/ShopBundle/DependencyInjection/Compiler/BackwardsCompatibility/ReplaceEmailManagersPass.php b/src/Sylius/Bundle/ShopBundle/DependencyInjection/Compiler/BackwardsCompatibility/ReplaceEmailManagersPass.php new file mode 100644 index 000000000000..64f2f51ee70e --- /dev/null +++ b/src/Sylius/Bundle/ShopBundle/DependencyInjection/Compiler/BackwardsCompatibility/ReplaceEmailManagersPass.php @@ -0,0 +1,75 @@ +getDefinitions() as $definition) { + if ($definition->getDecoratedService() === null) { + continue; + } + + $decoratedServiceClass = $definition->getDecoratedService()[0]; + + if ($decoratedServiceClass === 'sylius.email_manager.contact') { + $this->replaceArgument( + $container, + 'sylius.controller.shop.contact', + ContactController::class, + 6, + 'sylius.email_manager.contact', + ); + + continue; + } + + if ($decoratedServiceClass === 'sylius.email_manager.order') { + $this->replaceArgument( + $container, + 'sylius.listener.order_complete', + OrderCompleteListener::class, + 0, + 'sylius.email_manager.order', + ); + } + } + } + + public function replaceArgument( + ContainerBuilder $container, + string $serviceId, + string $serviceClass, + int $argumentIndex, + string $argumentId, + ): void { + try { + $listenerDefinition = $container->findDefinition($serviceId); + if ($listenerDefinition->getClass() === $serviceClass) { + $listenerDefinition->setArgument($argumentIndex, new Reference($argumentId)); + } + } catch (ServiceNotFoundException) { + return; + } + } +} diff --git a/src/Sylius/Bundle/ShopBundle/Resources/config/services/controller.xml b/src/Sylius/Bundle/ShopBundle/Resources/config/services/controller.xml index c369fc1494f3..b3ec867ac195 100644 --- a/src/Sylius/Bundle/ShopBundle/Resources/config/services/controller.xml +++ b/src/Sylius/Bundle/ShopBundle/Resources/config/services/controller.xml @@ -22,7 +22,7 @@ - + diff --git a/src/Sylius/Bundle/ShopBundle/Resources/config/services/email.xml b/src/Sylius/Bundle/ShopBundle/Resources/config/services/email.xml index ab0a35a63e7d..6512b0fff6fe 100644 --- a/src/Sylius/Bundle/ShopBundle/Resources/config/services/email.xml +++ b/src/Sylius/Bundle/ShopBundle/Resources/config/services/email.xml @@ -17,17 +17,27 @@ + The "%service_id%" service is deprecated since 1.13 and will be removed in 2.0. Use "sylius.mailer.contact_email_manager.shop" instead. - The "%alias_id%" service is deprecated since 1.13 and will be removed in 2.0. Use "Sylius\Bundle\CoreBundle\Mailer\ContactEmailManagerInterface" instead. + The "%alias_id%" service is deprecated since 1.13 and will be removed in 2.0. Use "sylius.mailer.contact_email_manager.shop" instead. + The "%service_id%" service is deprecated since 1.13 and will be removed in 2.0. Use "sylius.mailer.order_email_manager.shop" instead. - The "%alias_id%" service is deprecated since 1.13 and will be removed in 2.0. Use "Sylius\Bundle\CoreBundle\Mailer\OrderEmailManagerInterface" instead. + The "%alias_id%" service is deprecated since 1.13 and will be removed in 2.0. Use "sylius.mailer.order_email_manager.shop" instead. + + + + + + + + diff --git a/src/Sylius/Bundle/ShopBundle/Resources/config/services/listeners.xml b/src/Sylius/Bundle/ShopBundle/Resources/config/services/listeners.xml index 8cef42e9d66c..1c40c457deb1 100644 --- a/src/Sylius/Bundle/ShopBundle/Resources/config/services/listeners.xml +++ b/src/Sylius/Bundle/ShopBundle/Resources/config/services/listeners.xml @@ -45,7 +45,7 @@ - + diff --git a/src/Sylius/Bundle/ShopBundle/Tests/DependencyInjection/Compiler/BackwardsCompatibility/ReplaceEmailManagersPassTest.php b/src/Sylius/Bundle/ShopBundle/Tests/DependencyInjection/Compiler/BackwardsCompatibility/ReplaceEmailManagersPassTest.php new file mode 100644 index 000000000000..4497df13178e --- /dev/null +++ b/src/Sylius/Bundle/ShopBundle/Tests/DependencyInjection/Compiler/BackwardsCompatibility/ReplaceEmailManagersPassTest.php @@ -0,0 +1,62 @@ +setDefinition('sylius.email_manager.order', new Definition()); + $this->setDefinition('sylius.email_manager.order.decorated', (new Definition())->setDecoratedService('sylius.email_manager.order')); + $this->setDefinition('sylius.mailer.order_email_manager.shop', new Definition()); + $this->setDefinition('sylius.listener.order_complete', new Definition(OrderCompleteListener::class, [new Reference('sylius.mailer.order_email_manager.shop')])); + + $this->compile(); + + $this->assertContainerBuilderHasServiceDefinitionWithArgument( + 'sylius.listener.order_complete', + 0, + 'sylius.email_manager.order', + ); + } + + /** @test */ + public function it_does_nothing_if_shipment_email_manager_service_is_not_decorated(): void + { + $this->setDefinition('sylius.email_manager.order', new Definition()); + $this->setDefinition('sylius.mailer.order_email_manager.shop', new Definition()); + $this->setDefinition('sylius.listener.order_complete', new Definition(OrderCompleteListener::class, [new Reference('sylius.mailer.order_email_manager.shop')])); + + $this->compile(); + + $this->assertContainerBuilderHasServiceDefinitionWithArgument( + 'sylius.listener.order_complete', + 0, + 'sylius.mailer.order_email_manager.shop', + ); + } + + protected function registerCompilerPass(ContainerBuilder $container): void + { + $container->addCompilerPass(new ReplaceEmailManagersPass()); + } +}