Symfony2 ScopeCrossingInjectionException при использовании области прототипа
Моя цель - добавить data_collector в мои классы для отображения некоторой полезной информации на панели инструментов разработчика.
Мой сервис:
services:
my_api.auth.login:
class: YO\ApiV1\Services\Auth\Login
arguments:
- requestId
- "@old_sound_rabbit_mq.login_rpc"
- "@service_container"
scope: prototype
Мне нужен прототип прототипа, чтобы иметь разные экземпляры для каждого нового вызова. Кстати, service @old_sound_rabbit_mq.login_rpc имеет область "prototype".
И я хотел бы добавить data_collector, что можно сделать с помощью:
tags:
- { name: data_collector, template: "AcmeDebug:Collector:templatename", id: "your_collector_name" }
Но потом я получил исключение:
ScopeCrossingInjectionException: обнаружено пересечение области пересечения: Определение "профилировщик" ссылается на сервис "my_api.auth.login" который принадлежит другой иерархии областей. Эта услуга может не быть доступный последовательно. Как правило, безопаснее либо перемещать определение "профилировщик" в область "prototype" или объявить "контейнер" как дочерний масштаб "prototype". Если вы можете быть уверены, что другая область всегда активен, вы можете установить ссылку на strict = false, чтобы избавиться этой ошибки.
И это меня смущает, потому что я не знаю, что делать. Я попытался установить свойство "strict = false", но ничего не происходит.
Ответы
Ответ 1
Я думаю, что синхронизированные службы symfony могут вам помочь: doc
иначе вы можете установить "strict = false" следующим образом:
services:
my.service.definition:
class: Acme\Services\BlaService
arguments:
- "@any_other_service_from_narrower_scope="
scope: prototype
"=" в конце определения службы при инъекции службы из более узкой области действия будет "строго" до false
Ответ 2
Объем контейнера, поскольку Symfony 2.8 устарел.
scope: prototype
был заменен на shared: false
http://symfony.com/doc/2.8/cookbook/service_container/shared.html