11

モデルで entity_manager を使用します。ただし、entity_manager は controller: でのみ使用できますthrow $em = $this->get('doctrine.orm.entity_manager')。そのため、パラメーターを使用してモデル メソッドを定義する必要があり$emます。これにより、phpUnit のテストがかなり難しくなり、アプリケーションの構造に違反します。例えば:

class Settings
{
    public static function getParam( $em, $key )
    {
        $em->createQuery("
            SELECT s
            FROM FrontendBundle:Settings s
            WHERE s.param = {$key}
        ");
        return $em->getResult();
    }
}

モデル セクションで entity_manager サービスを使用する方法はありますか?

4

2 に答える 2

14

最初に、最初のメモ: 慣例により、Entity クラスはおそらく単数形である必要があります。つまり、設定ではなく、設定です。関連する設定のグループとしての「設定」は、1 つのエンティティと見なすことができると主張できます。それでも、心に留めておくべきことがあります。

Doctrine2 では、リポジトリを使用してこのタイプのクエリを作成します。を呼び出すコードではSettings::getParam、代わりにリポジトリを取得してクエリを実行します。symfony2 で、次のように言います。

// $em is your entitymanager, as you were going to pass to your method above
// $key is the key you were going to pass to your method above
$repository = $em->getRepository('\FrontendBundle\Settings');
$setting = $repository->getByParam($key);

デフォルトでは、コードを記述しなくても、リポジトリはエンティティの各フィールドに対して getByXXXX を定義します。

より複雑なクエリを作成する必要がある場合は、リポジトリを拡張できます。

use Doctrine\ORM\EntityRepository;

class SettingsRepository extends EntityRepository 
{
    public function getBySomeComplicatedQuery() {
        $sort_order = $this->getEntityManager()
            ->createQuery('SELECT count(s) FROM FrontendBundle\Settings s WHERE s.value > 32')
            ->getResult(Query::HYDRATE_SINGLE_SCALAR);
    }

}

そして、同じ方法でそのメソッドを呼び出します。

他の人は、Entity/ORM に結び付けられない Manager オブジェクトの使用を提唱しますが、この場合、それは不必要な複雑さだと思います。

Doctrine2 は、Entity ファイルでクエリを使用できないように特別に設計されています。Entity と EntityManagers は、実際には標準モデル レイヤーの 2 つの側面であり、ベスト プラクティスを適用するために分割されています。この記事を参照してください: http://symfony2basics.jkw.co.nz/get-symfony2-working/entities/

于 2011-05-27T06:17:29.153 に答える
8

Entity クラスのクエリ

あなたのエンティティにクエリを入れるのは奇妙に思えます。Doctrine 1 でモデルクラスにクエリを入れるのと同じ方法は、良い習慣とは見なされません。エンティティ クラスは軽量である必要があります。

私は実際にDoctrine2を学んでいて、同様の問題について考えていました.クエリをどこに置くのですか?

Doctrine 1 には特別な Table クラスがあり、Doctrine 2 でも似たようなものを期待していました。

リポジトリ パターン

今日、Doctrine 2 がリポジトリ パターンを使用していることを知りました: http://www.doctrine-project.org/docs/orm/2.0/en/reference/working-with-objects.html#custom-repositories

ただし、リポジトリ クラスのインスタンスを取得するには、Entity Manager を使用する必要があります。いずれにせよ、あなたはそれを必要とします。

それでも、リポジトリ パターンに従う方が良い選択のようです。

私の意見では、Entity クラスにクエリ メソッドを含めることを主張する場合は、Entity Manager をそれに渡す必要があります。

テスト

エンティティマネージャーを渡す必要があるとテストが難しくなるのはなぜですか? 私の経験から、明示的な依存関係を使用すると、テストでそれらを制御できるため (たとえば、それらをモック化できるため)、テストが容易になります。

一方、すべてのメソッドにエンティティ マネージャーを渡すことも正しい選択ではありません。そのような場合、依存関係を義務化し、コンストラクターに追加します。

于 2011-02-10T15:16:53.370 に答える