Skip to content

Commit

Permalink
[Shop] Introduce BC solution for deprecated and overwritten email man…
Browse files Browse the repository at this point in the history
…agers
  • Loading branch information
GSadee committed Feb 2, 2024
1 parent c9ff79e commit 6ad46ee
Show file tree
Hide file tree
Showing 5 changed files with 151 additions and 4 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
<?php

/*
* This file is part of the Sylius package.
*
* (c) Sylius Sp. z o.o.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

declare(strict_types=1);

namespace Sylius\Bundle\ShopBundle\DependencyInjection\Compiler\BackwardsCompatibility;

use Sylius\Bundle\ShopBundle\Controller\ContactController;
use Sylius\Bundle\ShopBundle\EventListener\OrderCompleteListener;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
use Symfony\Component\DependencyInjection\Reference;

/** @internal */
final class ReplaceEmailManagersPass implements CompilerPassInterface
{
public function process(ContainerBuilder $container): void
{
foreach ($container->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;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
<argument type="service" id="sylius.context.channel" />
<argument type="service" id="sylius.context.customer" />
<argument type="service" id="sylius.context.locale" />
<argument type="service" id="Sylius\Bundle\CoreBundle\Mailer\ContactEmailManagerInterface" />
<argument type="service" id="sylius.mailer.contact_email_manager.shop" />
</service>

<service id="sylius.controller.shop.homepage" class="Sylius\Bundle\ShopBundle\Controller\HomepageController">
Expand Down
14 changes: 12 additions & 2 deletions src/Sylius/Bundle/ShopBundle/Resources/config/services/email.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,27 @@

<service id="sylius.email_manager.contact" class="Sylius\Bundle\ShopBundle\EmailManager\ContactEmailManager">
<argument type="service" id="sylius.email_sender" />
<deprecated package="sylius/shop-bundle" version="1.13">The "%service_id%" service is deprecated since 1.13 and will be removed in 2.0. Use "sylius.mailer.contact_email_manager.shop" instead.</deprecated>
</service>
<service id="Sylius\Bundle\ShopBundle\EmailManager\ContactEmailManagerInterface" alias="sylius.email_manager.contact">
<deprecated package="sylius/shop-bundle" version="1.13">The "%alias_id%" service is deprecated since 1.13 and will be removed in 2.0. Use "Sylius\Bundle\CoreBundle\Mailer\ContactEmailManagerInterface" instead.</deprecated>
<deprecated package="sylius/shop-bundle" version="1.13">The "%alias_id%" service is deprecated since 1.13 and will be removed in 2.0. Use "sylius.mailer.contact_email_manager.shop" instead.</deprecated>
</service>

<service id="sylius.email_manager.order" class="Sylius\Bundle\ShopBundle\EmailManager\OrderEmailManager">
<argument type="service" id="sylius.email_sender" />
<argument type="service" id="sylius.mailer.order_email_manager" />
<deprecated package="sylius/shop-bundle" version="1.13">The "%service_id%" service is deprecated since 1.13 and will be removed in 2.0. Use "sylius.mailer.order_email_manager.shop" instead.</deprecated>
</service>
<service id="Sylius\Bundle\ShopBundle\EmailManager\OrderEmailManagerInterface" alias="sylius.email_manager.order">
<deprecated package="sylius/shop-bundle" version="1.13">The "%alias_id%" service is deprecated since 1.13 and will be removed in 2.0. Use "Sylius\Bundle\CoreBundle\Mailer\OrderEmailManagerInterface" instead.</deprecated>
<deprecated package="sylius/shop-bundle" version="1.13">The "%alias_id%" service is deprecated since 1.13 and will be removed in 2.0. Use "sylius.mailer.order_email_manager.shop" instead.</deprecated>
</service>

<service id="sylius.mailer.contact_email_manager.shop" class="Sylius\Bundle\CoreBundle\Mailer\ContactEmailManager">
<argument type="service" id="sylius.email_sender" />
</service>

<service id="sylius.mailer.order_email_manager.shop" class="Sylius\Bundle\CoreBundle\Mailer\OrderEmailManager">
<argument type="service" id="sylius.email_sender" />
</service>
</services>
</container>
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
</service>

<service id="sylius.listener.order_complete" class="Sylius\Bundle\ShopBundle\EventListener\OrderCompleteListener">
<argument type="service" id="Sylius\Bundle\CoreBundle\Mailer\OrderEmailManagerInterface" />
<argument type="service" id="sylius.mailer.order_email_manager.shop" />
<tag name="kernel.event_listener" event="sylius.order.post_complete" method="sendConfirmationEmail" />
</service>

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<?php

/*
* This file is part of the Sylius package.
*
* (c) Sylius Sp. z o.o.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

declare(strict_types=1);

namespace Sylius\Bundle\ShopBundle\Tests\DependencyInjection\Compiler\BackwardsCompatibility;

use Matthias\SymfonyDependencyInjectionTest\PhpUnit\AbstractCompilerPassTestCase;
use Sylius\Bundle\ShopBundle\DependencyInjection\Compiler\BackwardsCompatibility\ReplaceEmailManagersPass;
use Sylius\Bundle\ShopBundle\EventListener\OrderCompleteListener;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Reference;

final class ReplaceEmailManagersPassTest extends AbstractCompilerPassTestCase
{
/** @test */
public function it_replaces_decorated_order_email_manager_service_of_order_complete_listener_arguments(): void
{
$this->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());
}
}

0 comments on commit 6ad46ee

Please sign in to comment.