今回はみんな大好きEntityManagerの話題です。EC-CUBE3系でも4系でもデータを取り出したり保存したり、たくさん使われていますね。

その人気者のEntityManagerもたまに閉じこもってしまうことがあります。The EntityManager is closed.とエラーが表示され、データを取得したり登録したりしてくれないようになります。


これには理由がありまして、EntityManagerは例えばデータベースへの登録が一度失敗すると(プライマリーキーの重複など)、本当に”閉じて”しまい、その後クエリを受け付けなくなります。

どこかでエラーが発生しても最後まで実行するようなバッチ処理で起きそうとイメージしてもらえば良いのではないかと思います。
自ら閉じこもってしまったEntityManagerを再びバリバリ働くEntityManagerに戻ってもらうには、一度リセットしてやる必要があります。

EC-CUBE3の場合

if (!$app['orm.em']->isOpen()) {
    $app['orm.em'] = $app['orm.em']->create(
        $app['orm.em']->getConnection(),
        $app['orm.em']->getConfiguration()
    );
}

EC-CUBE4の場合

if (!$this->entityManager->isOpen()) {
    $this->entityManager = $this->entityManager->create(
        $this->entityManager->getConnection(),
        $this->entityManager->getConfiguration()
    );
}

EC-CUBE4系プラグイン