6

私は現在Symfony2で遊んでいて、今のところとても気に入っています。ただし、1つの質問が発生し、ベストプラクティスはどうなるのか疑問に思っています。

エンティティを永続化する場合は、次のようにする必要があります。

<?php
$myEntity = new Entity();
$myEntity->setSomeData('just an example');
$em = $this->get('doctrine')->getEntityManager();
$em->persist($myEntity);
$em->flush();

これは、何度も何度も実行する必要のある非常に多くのコードのようです。私が好むのはそのようなものです:

<?php
$myEntity = new Entity();
$myEntity->setSomeData('just an example');
$myEntity->persist();

ただし、エンティティマネージャーを取得する方法に基づくと、これはベストプラクティスとはほど遠いようです。だから私は何をすべきですか?あなたがそれをどのように扱うかについてのヒントはありますか?

4

2 に答える 2

11

これは、関心の分離を適切に維持するための標準的な方法です。エンティティは永続性レイヤーについて知る必要はありません。

ただし、新しいエンティティを作成して永続化するコードが実際に多数ある場合は、コントローラークラスにショートカットpersistAndFlushメソッドを追加するだけで簡単に実行できます。

于 2011-05-30T14:22:02.083 に答える
6

また、flushメソッドが実際にデータベースの変更を更新していることを忘れないでください。つまり、複数のエンティティを永続化する必要がある場合は、すべての永続化操作の最後に1回のフラッシュを実行することをお勧めします。

$entity1、、$entity2およびの3つのエンティティがあるとし$entity3ます。次に、このコードは最適ではありません。

$em->persist($entity1);
$em->flush();

$em->persist($entity2);
$em->flush();

$em->persist($entity3);
$em->flush();

このコードは、データベースを1回だけ同期するため、パフォーマンスが向上します。

$em->persist($entity1);
$em->persist($entity2);
$em->persist($entity3);

$em->flush();

したがって、コントローラーにショートカットをpersistAndFlush設定することは、複数のエンティティを永続化する必要がある場合には効率的ではないため、注意して使用する必要があります。これは、Doctrine2のドキュメント(ページの3/4)に記載されています。ここに公式2.0ドキュメントから取られたテキストがあります:

エンティティを変更するたび、またはpersist / remove / merge / ...を呼び出すたびに、フラッシュを呼び出さないでください。これはアンチパターンであり、アプリケーションのパフォーマンスを不必要に低下させます。代わりに、オブジェクトを操作する作業単位を形成し、完了したらフラッシュを呼び出します。単一のHTTPリクエストを処理している間は、通常、0〜2回を超えてフラッシュを呼び出す必要はありません。

よろしく、マット

于 2011-06-01T16:14:23.560 に答える