VTE*_*TEX 9 php orm zend-framework doctrine-orm
因此,在使用Doctrine2违反完整性约束之后,EntityManager喜欢以不可能继续使用所述EntityManager的方式关闭.流行的想法似乎是你应该创建一个新的EntityManager,而不是被允许捕获这个简单的异常并以优雅的方式处理它(精彩的设计有人/讽刺).
但是,当使用Bisna库/ ZF 1.12和封闭的实体管理器时会出现问题.Bisna库不提供公共方法来在Container类中关闭后创建具有相同名称(即"默认")的新EntityManager.
我的问题是处理这个问题的最佳方法是什么.在违反完整性约束之后,必须有一种方法可以优雅地恢复.
您应该专注于防止完整性约束违规,而不是尝试从这些情况中恢复:
更新:
Doctrine2 关闭 EntityManager 的原因是因为在大多数情况下它不再可以安全使用。它的 UnitOfWork 包含无法完成的操作(因此抛出异常)。
您是对的,Bisna 库不支持创建新的 EntityManager。您可以扩展它以自己实现此类功能。
另一种解决方案是手动处理事务:
$em->getConnection()->beginTransaction(); // suspend auto-commit
try {
// do some work
$user = new User;
$user->setName('George');
$em->persist($user);
$em->flush();
$em->getConnection()->commit();
} catch (Exception $e) {
$em->getConnection()->rollback();
$em->clear(); // in stead of $em->close();
throw $e;
}
Run Code Online (Sandbox Code Playgroud)
$em->close()通过替换,$em->clear()您可以保持 EntityManager 的打开和清洁以便再次使用。
我强烈建议您关闭或清除EntityManager,因为其中的数据(几乎总是)不再可用。