5.5 Необязательные зависимости
Бывают ситуации, когда сервис знает как использовать другой сервис, но на самом деле он не является необходимым для его работы. Например сервис может знать как работать с логгером, чтобы залогировать что-нибудь с целью отладки.
Тут также имеется 2 способа внедрения зависимостей:
Можно использовать необязательный аргумент конструктора, для которого задать значение по-умолчанию null:
... public function __construct( LoggerInterface $logger = null ) { $this->logger = $logger; } ...
Тогда при определении сервиса необходимо пометить необязательные зависимости знаком вопроса:
services: some_service: class: AcmeBundle\Service\SomeService arguments: ['@?logger’]
Для проверки внедрена зависимость или нет можно использовать конструкцию:
if ($this->logger instanceof LoggerInterface) { ... }
Второй способ - использовать необязательные вызовы сеттеров.
... public function setLogger(LoggerInterface $logger = null) { $this->logger = $logger; } ...
А при определении сервиса необходимо добавить вызов setLogger(). Когда сервис не доступен, можно указать, что он должен быть игнорирован, то есть зависимость необязательная:
services: some_service: class: AcmeBundle\Service\SomeService calls: - [setLogger, ['@?logger’]]