Symfony 4: Статически получить контейнер в классе помощника - PullRequest
0 голосов
/ 07 ноября 2018

Я работаю над активной системой записи для symfony, и у меня возникла проблема.

У меня есть вспомогательный класс в Symfony, который не сервис, и при этом я не хочу, чтобы он стал им. Этот класс имеет статическое свойство с именем container и статический метод для его установки. Теперь возникает вопрос, когда я вызываю этот статический метод для установки контейнера?

Я пробовал расширение пакета, проход компилятора, но все безуспешно. (В основном потому, что они должны быть сервисами, и когда я делаю это сервисом и расширяю его позже, он пропускает этап компиляции.)

Дайте мне знать, если кому-то понадобится дополнительная информация, и заранее спасибо!

1 Ответ

0 голосов
/ 07 ноября 2018

Если вы хотите внедрить контейнер в помощник, то есть вызвать Helper::set($ontainer), вам нужно сделать это, когда скомпилированный контейнер будет доступен. И расширение, и проход компилятора изменяют контейнер перед компиляцией и, следовательно, вероятно, являются неподходящим местом, если только вы не хотите внедрить помощника в качестве службы в контейнер и ссылаться на контейнер, подобно тому, как показано в следующем подходе.

Вы можете вызвать метод Setter в своем Ядре, где создается контейнер, или в Контроллере, который загружается при сборке контейнера и - при расширении класса Controller -base имеет доступ к контейнер. Я не думаю, что это хорошая идея, потому что вы никогда не можете быть уверены, когда / если метод был вызван и какой контейнер там находится. Кроме того, при использовании нового базового класса AbstractController у вас нет доступа к полному контейнеру, только указатель службы для определенных служб, необходимых для контроллера.

При настройке его в качестве службы внутри services.yaml вы можете использовать вызовы или установщик инъекции , чтобы внедрить службу контейнера, ссылаясь на @container. Я также не рекомендовал бы это, но я считаю, что это меньшее из двух зол, учитывая то, что вы просите.

...