我想在实体中使用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();
答案 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:
警告词:这是一个非常强大的钩子,可以改变您使用域模型的方式。 使用此挂钩将破坏域对象内的单一责任原则 并增加数据库和对象的耦合。