如何在Symfony中用自定义装饰器替换服务装饰器?

时间:2019-10-06 10:57:30

标签: symfony symfony4 sylius

在基于 Sylius Symfony -4-Application中,有一个服务装饰器放置在其Core的深处:

   <service id="sylius.order_item_quantity_modifier.limiting" class="Sylius\Component\Core\Cart\Modifier\LimitingOrderItemQuantityModifier" decorates="sylius.order_item_quantity_modifier" decoration-priority="256">
        <argument type="service" id="sylius.order_item_quantity_modifier.limiting.inner" />
        <argument>9999</argument>
    </service>

但是,我想在其服务定义中以don't want this limitation that is hard coded的形式替换此装饰器。

我该如何替换呢?

我试图围绕该服务装饰器定义一个服务装饰器,但是由于某些原因,它并不适用:

app.core.cart.modifier:
    class: AppBundle\Component\Core\Cart\Modifier\MyLimitingOrderItemQuantityModifier
    decorates: sylius.order_item_quantity_modifier.limiting
    decoration_priority: 1000
    arguments:

我还尝试用自己的类替换其service-id,该类也不起作用:

   sylius.order_item_quantity_modifier.limiting:
        class: AppBundle\Component\Core\Cart\Modifier\MyLimitingOrderItemQuantityModifier
        decorates: sylius.order_item_quantity_modifier.limiting
        decoration_priority: 100
        arguments:
            - "@app.core.cart.modifier.inner"

任何帮助,不胜感激!

1 个答案:

答案 0 :(得分:1)

您可以选择2或3个选项:

  1. 假设您拥有您的装饰器,该装饰器装饰基本服务的优先级高于 sylius装饰器,这意味着:

    • 如果您使用注入的 XXXXXXX.inner 服务,而不是基本服务,它将是优先级较低的装饰器:您情况下的 sylius装饰器
    • >
    • 您可以决定使用 XXXXXXX.inner 注入的服务,并完全重写使用硬编码值的功能。这对可维护性不好,但是已经完成的方式也不是……
  2. 您可以使用Compiler Pass删除装饰器定义,或者甚至替换硬编码参数(如果要使用)另一个值或一个参数:-)
    有关can be found here

  3. 的更多信息

我刚刚在sylius / sylius存储库上看到了您的问题,第二个解决方案可能是最好的(当核心发生变化时,很容易删除)!