Get entityManager inside an Entity

前端 未结 5 592
自闭症患者
自闭症患者 2020-11-30 09:44

I\'d like to use, something like:

$em = $this->getEntityManager();

Inside a Entity.

I understand I should do this as a s

5条回答
  •  再見小時候
    2020-11-30 10:20

    As pointed out (again) by a commenter, an entity manager inside an entity is a code smell. For the OP's specific situation where he wished to acquire the entity manager, with the least bother, a simple setter injection would be most reliable (contrary to my original example injecting via constructor).

    For anyone else ending up here looking for a superior solution to the same problem, there are 2 ways to achieve this:

    1. Implementing the ObjectManagerAware interface as suggested by https://stackoverflow.com/a/24766285/1349295

      use Doctrine\Common\Persistence\ObjectManagerAware;
      use Doctrine\Common\Persistence\ObjectManager;
      use Doctrine\Common\Persistence\Mapping\ClassMetadata;
      use Doctrine\ORM\Mapping as ORM;
      
      /**
       * @ORM\Entity
       */
      class Entity implements ObjectManagerAware
      {
          public function injectObjectManager(
              ObjectManager $objectManager,
              ClassMetadata $classMetadata
          ) {
              $this->em = $objectManager;
          }
      }
      
    2. Or, using the @postLoad/@postPersist life cycle callbacks and acquiring the entity manager using the LifecycleEventArgs argument as suggested by https://stackoverflow.com/a/23793897/1349295

      use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
      use Doctrine\ORM\Mapping as ORM;
      
      /**
       * @ORM\Entity
       * @ORM\HasLifecycleCallbacks()
       */
      class Entity
      {
          /**
           * @ORM\PostLoad
           * @ORM\PostPersist
           */
          public function fetchEntityManager(LifecycleEventArgs $args)
          {
              $this->setEntityManager($args->getEntityManager());
          }
      }
      

    Original answer

    Using an EntityManager from within an Entity is VERY BAD PRACTICE. Doing so defeats the purpose of decoupling query and persist operations from the entity itself.

    But, if you really, really, really need an entity manager in an entity and cannot do otherwise then inject it into the entity.

    class Entity
    {
        private $em;
    
        public function __contruct($em)
        {
            $this->em = $em;
        }
    }
    

    Then invoke as new Entity($em).

提交回复
热议问题