Если вы хотите внедрить контейнер в помощник, то есть вызвать Helper::set($ontainer)
, вам нужно сделать это, когда скомпилированный контейнер будет доступен. И расширение, и проход компилятора изменяют контейнер перед компиляцией и, следовательно, вероятно, являются неподходящим местом, если только вы не хотите внедрить помощника в качестве службы в контейнер и ссылаться на контейнер, подобно тому, как показано в следующем подходе.
Вы можете вызвать метод Setter в своем Ядре, где создается контейнер, или в Контроллере, который загружается при сборке контейнера и - при расширении класса Controller
-base имеет доступ к контейнер. Я не думаю, что это хорошая идея, потому что вы никогда не можете быть уверены, когда / если метод был вызван и какой контейнер там находится. Кроме того, при использовании нового базового класса AbstractController
у вас нет доступа к полному контейнеру, только указатель службы для определенных служб, необходимых для контроллера.
При настройке его в качестве службы внутри services.yaml
вы можете использовать вызовы или установщик инъекции , чтобы внедрить службу контейнера, ссылаясь на @container
. Я также не рекомендовал бы это, но я считаю, что это меньшее из двух зол, учитывая то, что вы просите.