我可以在实体中使用getDoctrine和getManager吗?对不起,我不明白这是怎么回事

时间:2014-08-21 08:57:56

标签: symfony doctrine sonata-admin

我想在实体中使用getDoctrine和getManager函数。这可能吗?或者这有什么方法吗?我想在这样的数据库中插入一些东西:

$history = new Policy();
        $history->setName($file1->getClientOriginalName());
        $history->setPolicyNumber($this->getPolicyNumber());
        $history->setOrderId($this->getOrderId());
        $history->setPath($this->getPathFile1());
        $history->setDocumentType($this->getDocument1Type());
        $history->setPrintAction($this);

        $em = $this->getDoctrine()->getManager();
        $em->persist($history);
        $em->flush();

2 个答案:

答案 0 :(得分:4)

使用Doctrine ORM,实体有一个独特的角色:数据容器! 根据Doctrine架构,没有理由在内部注入EntityManager。

如果您需要这样做,那么您正尝试将Business层的一些代码放入图层。 因此,请尝试将代码移动到服务中,例如您的实体的管理员,或者如果您在控制器中懒惰,但它有点麻烦。

答案 1 :(得分:1)

我会冒险先回答这个问题,然后给出建议。

如果您查看Doctrine2的源代码,您可以在Doctrine\ORM\UnitOfWork中找到此方法:

/**
 * @param ClassMetadata $class
 *
 * @return \Doctrine\Common\Persistence\ObjectManagerAware|object
 */
private function newInstance($class)
{
    $entity = $class->newInstance();

    if ($entity instanceof \Doctrine\Common\Persistence\ObjectManagerAware) {
        $entity->injectObjectManager($this->em, $class);
    }

    return $entity;
}

所以......这意味着,如果你的实体实现\Doctrine\Common\Persistence\ObjectManagerAware,你将在Doctrine2实体中拥有EntityManager。那就是它。

现在建议:

非常糟糕的做法,不推荐使用

来自\Doctrine\Common\Persistence\ObjectManagerAware界面的PhpDoc:

警告词:这是一个非常强大的钩子,可以改变您使用域模型的方式。  使用此挂钩将破坏域对象内的单一责任原则  并增加数据库和对象的耦合。