Как заменить сервис-декоратор на собственный декоратор в Symfony? - PullRequest
0 голосов
/ 06 октября 2019

В Symfony -4-приложении, основанном на Sylius , имеется сервисный декоратор, помещенный глубоко в их 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>

Однако я хочу заменить этот декоратор, поскольку я не хочу, чтобы это ограничение было жестко задано в его определении сервиса.

Как я могу заменить это?

Я пытался определить декоратор сервиса вокруг этого декоратора сервиса, но он не применяется по некоторым причинам:

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

Я также пытался заменить его идентификатор сервиса своим собственным классом, который не работалЛибо:

   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 Ответ

1 голос
/ 07 октября 2019

У вас может быть 2 или 3 варианта:

  1. Допустим, у вас есть ваш декоратор , который украшает базовый сервис, с более высоким приоритетом, чем sylius decorator , это означает, что:

    • , если вы используете внедренный сервис XXXXXXX.inner , вместо того, чтобы быть базовым сервисом, он будет декоратором с более низким приоритетом: sylius decorator в вашем случае
    • вы можете просто решить не использовать сервис XXXXXXX.inner и полностью переписать функцию, котораяиспользует жестко закодированное значение. Это нехорошо для удобства обслуживания, но способ, которым это уже сделано, тоже не подходит ...
  2. Вы можете играть с проходом компилятора до удалить определение декоратора или даже заменить жестко заданный аргумент , если вы хотите использовать другое значение, или, может быть, параметр: -)
    Дополнительная информация о том, что можетможно найти здесь

Я только что видел вашу проблему в репозитории sylius / sylius, второе решение может быть лучшим (его легко удалить, когда ядро ​​изменится)!

...