使用Bisna/Doctrine2处理封闭的EntityManager

VTE*_*TEX 9 php orm zend-framework doctrine-orm

因此,在使用Doctrine2违反完整性约束之后,EntityManager喜欢以不可能继续使用所述EntityManager的方式关闭.流行的想法似乎是你应该创建一个新的EntityManager,而不是被允许捕获这个简单的异常并以优雅的方式处理它(精彩的设计有人/讽刺).

但是,当使用Bisna库/ ZF 1.12和封闭的实体管理器时会出现问题.Bisna库不提供公共方法来在Container类中关闭后创建具有相同名称(即"默认")的新EntityManager.

我的问题是处理这个问题的最佳方法是什么.在违反完整性约束之后,必须有一种方法可以优雅地恢复.

Jas*_*wer 2

您应该专注于防止完整性约束违规,而不是尝试从这些情况中恢复:

  • 如果遇到外键约束,则说明您没有以正确的方式将实体绑定在一起。
  • 如果遇到唯一约束,则应在尝试保留数据之前检查数据库中是否有可能重复的数据。
  • 如果您遇到其他类型的约束并且不知道如何防止它,请询问:)

更新:

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,因为其中的数据(几乎总是)不再可用