经常遇到以下代码:
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
注入服务时,都会选择您的。