Использование определений сервисов Symfony2 в Symfony4 с несколькими сервисами для одного и того же класса

У меня есть следующее определение службы в Symfony2

      app.service_1:
   class: Symfony\Component\Lock\Store\RedisStore
   arguments:
       - '@snc_redis.default_cache'

app.service_2:
    class: Symfony\Component\Lock\Store\RedisStore
    arguments:
        - '@snc_redis.scheduler_cache'

Теперь я планирую перейти на Symnfony4, где мне нужно указать путь к классам в качестве имени службы.

      Symfony\Component\Lock\Store\RedisStore
   arguments:
       - '@snc_redis.default_cache'

Symfony\Component\Lock\Store\RedisStore
    arguments:
        - '@snc_redis.scheduler_cache'

Здесь проблема в том, что у него такое же имя, потому что мы используем один и тот же путь к классам? Как я могу это исправить? Могу ли я использовать псевдоним с другими параметрами?

2 ответа

Вам не нужно менять определение.

Когда вам нужно создать несколько сервисов из одного класса, использование FQCN в качестве идентификатора не сработает. Использование полного имени класса рекомендуется и является хорошей практикой, но не обязательно. В большинстве случаев это практично, так как вы можете опустить class аргумент, и вам не нужно выбирать имя для каждой службы.

Ваше исходное определение полностью совместимо с Symfony 4 (или 5):

      app.service_1:
   class: Symfony\Component\Lock\Store\RedisStore
   arguments:
       - '@snc_redis.default_cache'

app.service_2:
    class: Symfony\Component\Lock\Store\RedisStore
    arguments:
        - '@snc_redis.scheduler_cache'

Я бы просто посоветовал использовать более описательные идентификаторы, чем service_1 и service_2.

Другой способ - использовать псевдоним, например, объяснение в документации.

      services:
  Symfony\Component\Lock\Store\RedisStore:
    public: false
    arguments:
      - '@snc_redis.default_cache'

  app.service_1:
    alias: Symfony\Component\Lock\Store\RedisStore
    public: true

  Symfony\Component\Lock\Store\RedisStore:
    arguments:
      - '@snc_redis.scheduler_cache'
  app.service_2:
    alias: Symfony\Component\Lock\Store\RedisStore
    public: true

Вы также можете использовать bind и autowire: trueдля ваших аргументов. Но ваши переменные в services.yml должны быть такими же, как они объявлены в конструкторе ваших сервисов. Выглядит примерно так:

      services:
  # default configuration for services in *this* file
  _defaults:
    autowire: true      
    autoconfigure: true
    bind:
      $defaultCache: '@snc_redis.default_cache'
      $schedulerCache: '@snc_redis.scheduler_cache'

    Symfony\Component\Lock\Store\RedisStore:
      public: false

(или используйте привязку только в декларации службы).

PS: осторожно в вашем примере, вы пропустите : после пути к классу :)

Другие вопросы по тегам