Как получить объект Container из LifecycleEventArgs postLoad в Entity?

Я пытаюсь ввести объект Container (который доступен в контроллерах) в Entity, используя lifecycleCallbacks postLoad . Аргументом метода postLoad является LifecycleEventArgs . Я могу увидеть свойство контейнера (которое я хочу получить) в EventManager LifecycleEventArgs соответствии с выводом дампа, но он кажется закрытым, и в getContainer() нет getContainer() . Ниже приведен мой код.

service.yml

 services: ibw.jobeet.entity.job.container_aware: class: Ibw\JobeetBundle\Entity\Job tags: - { name: doctrine.event_listener, event: postLoad } 

ИВТ \ JobeetBundle \ Entity \ Job.php

 <?php namespace Ibw\JobeetBundle\Entity; use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Event\LifecycleEventArgs; use Symfony\Component\Validator\Constraints as Assert; use Symfony\Component\HttpFoundation\File\UploadedFile; use Symfony\Component\DependencyInjection\ContainerAware; use Symfony\Component\DependencyInjection\ContainerInterface; use Ibw\JobeetBundle\Utils\Jobeet; /** * Job */ class Job { //.... /** * @var Container */ protected $container; public function postLoad(LifecycleEventArgs $eventArgs) { $entity = $eventArgs->getEntity(); $entityManager = $eventArgs->getEntityManager(); $eventManager = $entityManager->getEventManager(); echo '<pre>'; \Doctrine\Common\Util\Debug::dump($eventManager, 3); // want to get $eventManager->container here exit; } //.... } 

Есть ли другой способ получить его?

    Related of "Как получить объект Container из LifecycleEventArgs postLoad в Entity?"

    Вы можете использовать setter-injection, которые приводят к вызову предопределенного метода ( setContainer() в этом случае) с контейнером в качестве аргумента при создании службы прослушивателя:

     services: ibw.jobeet.entity.job.container_aware: class: Your\Bundle\Doctrine\Event\Listener\JobListener calls: - [setContainer, ["@service_container"]] tags: - { name: doctrine.event_listener, event: postLoad } 

    Теперь контейнер вводится в конструктор вашего класса слушателя:

     namespace Your\Bundle\Doctrine\Event\Listener; use Symfony\Component\DependencyInjection\ContainerInterface; use Doctrine\ORM\Event\LifecycleEventArgs; class JobListener { /** @var ContainerInterface */ protected $container; /** * @param ContainerInterface @container */ public function setContainer(ContainerInterface $container) { $this->container = $container; } public function postLoad(LifecycleEventArgs $eventArgs) { $entity = $eventArgs->getEntity(); // do something with your entity here ie $entity->setFoo($this->container->getParameter('foo')); 

    Это просто пример. Пожалуйста, подумайте о том, чтобы вводить только те услуги, которые вам действительно нужны, вместо того, чтобы вводить сам контейнер. Вы будете вознаграждены лучшей тестируемостью и эффективностью.