Использование определений сервисов 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: осторожно в вашем примере, вы пропустите
:
после пути к классу :)