为EntityManager创建扩展的正确方法



经常遇到以下代码:

catch (Exception $ex){
$em->clear();
if($em->getConnection()->isTransactionActive())
$em->rollback();
{somecode}
}

首先考虑创建EntityManager的继承器,包含方法,实现clear和rollback,并将其放入DI容器中。但评论中的Doctrine EntityManager类标记为最终类:

/* final */class EntityManager implements EntityManagerInterface

助手即服务将是丑陋的。知道吗?

您可以使用装饰。大致如下:

class MyEntityManager implements EntityManagerInterface
{
private $decoratedManager;
public function __construct(EntityManagerInterface $entityManager)
{
$this->decoratedManager = $entityManager;
}
/**
* Implement all methods on the interface like this:
*/
public function persist($entity)
{
return $this->decoratedManager->persist($entity);
} 
}

这不会破坏final,您可以轻松地覆盖函数。然后,在服务配置中,您必须覆盖实体管理器的服务定义,或者确保每当您想将EntityManagerInterface注入服务时,都会选择您的。

相关内容

  • 没有找到相关文章

最新更新