如何在连接失败后记录数据库中的条目(实体管理器已关闭)

时间:2015-04-26 17:17:24

标签: php entity-framework symfony doctrine-orm entitymanager

在我的symfony 2 / doctrine2应用程序中,我使用实体监听器来捕获异常,并在数据库中尚未记录错误时向自己发送电子邮件。

除非错误是数据库中的失败条目,否则它可以正常工作。在这种情况下,实体管理器已关闭,我不能再在我的异常监听器中使用它。

我无法重置实体管理器,因为它会重用任何实体并抛出新错误(通过...找到新实体)

我不想使用不同的实体经理,因为重新映射每个实体都很痛苦。

我知道如何解决这个问题吗?

Thansk很多!

1 个答案:

答案 0 :(得分:1)

我们的项目遇到了同样的问题,因为我们使用数据库假脱机邮件,我们有一个邮件错误报告器。因此,如果发生关闭EM的异常,我们会有一个“补丁”。

我们部分解决了在需要时创建EM的新实例的问题。这不是一个完美的解决方案,但它确实有效。无论如何,这是一次故障转移,而不是正常的操作。

我们将此代码放在我们的电子邮件假脱机程序中:

    if(!$this->em->isOpen()) {
        $connection = $this->em->getConnection();

        while($connection->getTransactionNestingLevel() > 0) {
            // clean-up of any open transaction 
            $connection->rollBack();
        }

        // new EM
        $this->em = $this->em->create($connection, $this->em->getConfiguration());

        // this is needed if you use the Blameable extension,
        // because at this point of the code, we no longer have a logged user to "blame"
        $user = $this->em->getRepository('FacileCbrCoreBundle:User\User')->loadUserByUsername('facile_cbr');
        $emailEntity->setCreatedBy($user);
    }