Из-за чего возникает ошибка The EntityManager is closed?

Использую в своем проекте ORM Doctrine 2. Есть сущность, пытаюсь добавить запись в БД след. образом:

$entity = new SomeEntity;
$entity->setCreated(new \DateTime())
            ->setSomeField(...);

$this->em->persist($entity);
$this->em->flush($entity);


Выдает эксепшен The EntityManager is closed.

В doctrine/orm/lib/Doctrine/ORM/EntityManager.php есть поле closed, есть методы close(), errorIfClosed() и isOpen(). Не пойму, для чего используется это поле и в каком случае оно задается как closed = true;

Что означает эта ошибка и из-за чего может возникать?
  • Вопрос задан
  • 12585 просмотров
Решения вопроса 1
BoneFletcher
@BoneFletcher
А какой результат выполнения
$this->em->isOpen();до добавления новой сущности? Если false - то произошла ошибка где-то до этого.

Обрабатываются ли события prePersist, postPersist? Ошибка может быть там, особенно если в них еще раз вызывается flush.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
fenric
@fenric
EntityManager закрывается сам при любой ошибке связанной с ORM, например если запрос к БД некорректный, это большая проблема в проектах где используется демонизация PHP процессов. Если ваше приложение базируется на PSR-15 и PHP-DI, вы можете поддерживать EntityManager всегда открытым используя следующее промежуточное ПО:
https://github.com/autorusltd/doctrine-persistent-...

В любом случае, даже если это не ваш стек, вы можете, как минимум, понять, как его переоткрывать. Но самое важное, контролируйте ошибки в вашем приложении, не усложняйте его, постарайтесь писать так, чтобы работа с БД происходила только в endpoint-ах (репозиториях, которые вызываются в endpoint-ах), а не была размазана по проекту...
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Значит где-то вы закрываете EntityManager (вызывается метод close()).

stackoverflow.com/questions/14258591/the-entityman...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы