Doctrine2 が The EntityManager is closed. って言う

「The EntityManager is closed.」が出るのは Doctrine2 内部で closed フラグが立っているかららしい。Doctrine2 使っていろいろやってる中で「1048 Column 'カラム名' cannot be null」みたいなエラーが発生すると EntityManager::closed が true となって persist() や flush() する際に throw ORMException::entityManagerClosed(); ってことになる。

今回は直前に「cannot be null」が出たので persist() する前にちゃんと値を検証して Doctrine2 が例外を投げないように対処することで問題回避。

- - -

実は以前にも「The EntityManager is closed. 」が出たことがあった。その時は PDOException がうまくキャッチ出来てなかったっぽい。

普段は catch (Exception $e) で PDOException をキャッチしてエラー内容を表示してくれるんだけど、その時はなぜか The EntityManager is closed. と表示されるだけ。Statement::execute() の中で Exception の $ex をダンプするとちゃんと PDOException オブジェクトなんだけど、、、。

なのでとりあえず catch (PDOException $e) を追加した。

try {
// $EntityManager->flush(); など
}
catch (PDOException $e) { // ←追加
echo $e->getMessage();
}
catch (Exception $e) {
echo $e->getMessage();
}

かわのくんとは

Web系IT企業でプログラミングやマネジメントをしています。趣味で音楽を少々。

Youtubeでライブ動画配信中

Ustreamでライブ動画配信中

スマートフォン向けにPCサイトを自動変換(コンバート)する『CONV2SP』 CSS作成支援ツール『CSSツクール』