Я пытаюсь ввести объект 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; } //.... }
Есть ли другой способ получить его?
Вы можете использовать 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'));
Это просто пример. Пожалуйста, подумайте о том, чтобы вводить только те услуги, которые вам действительно нужны, вместо того, чтобы вводить сам контейнер. Вы будете вознаграждены лучшей тестируемостью и эффективностью.