在实体中获取entityManager

Rei*_*erd 19 doctrine symfony

我想用,比如:

$em = $this->getEntityManager();
Run Code Online (Sandbox Code Playgroud)

在实体内部.

我知道我应该将此作为一项服务,但出于某些测试目的,我想从实体访问它.

是否有可能实现这一目标?

我试过:

$em = $this->getEntityManager();
$profile_avatar = $em->getRepository('bundle:Perfils')->findOneByUser($this-getId());
Run Code Online (Sandbox Code Playgroud)

但是没有用.

致命错误:调用未定义的方法代理\ webBundleEntityUserProxy :: getEntityManager()在 /opt/lampp/htdocs/web/src/Pct/bundle/Entity/User.php上线 449

我为什么要这样做呢?

我有3种用户:Facebook,Twitter和MyOwnWebsite用户.他们每个都有不同的头像链接Facebook的个人资料,推特或其他,如果它的myownwebsite用户,我从数据库中的URL检索头像.目前,我不想创建服务,因为我只是想让它工作,测试它,而不是创建一个最终部署.所以这就是我试图从实体中调用实体管理器的原因.到目前为止,我不想修改配置文件,只需修改此实体.

Cza*_*ino 26

正如评论者(再次)指出的那样,实体内部的实体经理是代码气味.对于OP的特定情况,他希望以最少的麻烦获得实体经理,简单的setter注入将是最可靠的(与我通过构造函数注入的原始示例相反).

对于最终在这里寻找针对同一问题的出色解决方案的其他人来说,有两种方法可以实现这一目标:

  1. ObjectManagerAware按照/sf/answers/1733639981/的建议实现接口

    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;
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 或者,使用@postLoad/ @postPersistlife循环回调并使用/sf/answers/1665572821/LifecycleEventArgs建议的参数获取实体管理器

    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());
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

原始答案

EntityManager在一个内部使用一个Entity非常糟糕的做法.这样做会破坏将查询和持久操作与实体本身分离的目的.

但是,如果你真的,真的,真的需要一个实体中的实体管理器而不能做其他事情然后将其注入实体.

class Entity
{
    private $em;

    public function __contruct($em)
    {
        $this->em = $em;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后调用为new Entity($em).

  • 是的,但你忘了说这是一个非常糟糕的做法 (5认同)
  • @DonCallisto大声笑,是的,你是对的.让我来修改我的答案.我只想回答如何"在实体中获取entityManager".因为没有陈述我一直以来的想法,我感到愚蠢. (3认同)

ona*_*lbi 5

最好的方法是使用生命周期: @ORM\HasLifecycleCallbacks

您可以根据需要使用相应的事件获得结果:

@postLoad
@postPersist
...
Run Code Online (Sandbox Code Playgroud)