В моем приложении symfony 2 / doctrine2 я использую прослушиватель сущностей для перехвата исключений и отправки себе электронного письма, если ошибка еще не зарегистрирована в базе данных.
Он работает нормально, за исключением случаев, когда ошибка является ошибочной записью в базе данных. В этом случае менеджер сущностей закрыт, и я больше не могу использовать его в моем прослушивателе исключений.
Я не могу сбросить менеджер сущностей, потому что он будет перепрошивать любую сущность и выдавать новые ошибки (новая сущность была найдена через …)
Я бы предпочел не использовать другого менеджера сущностей, потому что переотображать каждую сущность — это боль.
Есть идеи, как я могу решить это?
Большое спасибо!
У нас была та же проблема в нашем проекте, потому что мы используем БД для спулинга наших писем, и у нас есть репортер ошибок почты. Итак, в случае исключения, которое закрывает 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);
}
Других решений пока нет …