2017-02-08 7 views
0

私は現在のバージョンのSymfony(3.2.3)とDoctrine ORM(2.5.6)を使用していますが、私はまだgetEntityManager()とその関連メソッドの非推奨を処理する方法について私の頭を払うつもりです。例えばSymfony 3でEntityManagerを正しく取得するにはどうすればいいですか?

、現在documentationが、これは、クエリビルダインスタンスを作成するための方法であると述べている:

$repository = $this->getDoctrine()->getRepository('AppBundle:Product'); 
$queryBuilder = $repository->createQueryBuilder('p') 

しかし、私が見る方法は、それ(と私のIDEは同意するようだ)、getRepository()はにタイプをほのめかしていますObjectRepositoryのインスタンスを返し、メソッドcreateQueryBuilder()はそのインターフェイスではなく、実装クラスEntityRepositoryで宣言されています。

他の例では、コントローラにトランザクションを開始する、明示的に次のようになります。

$this->getDoctrine()->getEntityManager()->getConnection()->beginTransaction() 

後者の方法が推奨されませんので、私が代わりにgetManager()getEntityManager()を呼び出すようになっています。しかし、getManager()は、ObjectManagerのインスタンスを返すようヒントされ、getConnection()を宣言しません。

PHPはPHPであり、コードはまだすべてのケースで動作しているようですが、私のIDEと私は不安を感じます。では、は何ですかクエリビルダーを作成する方法や、Symfony 3でトランザクションを開始する方法はありますか?何か不足していますか?

答えて

1

Doctrineには、RDBMSの場合はORM、ドキュメント指向のDBの場合はODM(主にMongoDBの場合)の2種類のデータマッパーがあります。データマッパーは、一種の永続性(無知)を達成しようとしており、どちらもObjectManagerまたはObjectRepositoryのようにDoctrine\Commonに定義されている汎用インターフェースを実装しています。

symfonyでは、getDoctrine()メソッドは、(デフォルト)からRegistryクラスのインスタンスを返します。要するに、このサービスはすべての利用可能な接続とエンティティマネージャを保持します。彼のメソッドgetManager()Doctrine\Commonに実装されていますが、どのタイプのデータマッパーが知られておらず、戻り値の型が汎用のObjectManagerとして宣言されています。

IDEの警告を避けるために、インラインPHPDocを明示的に定義することができます。 NetbeansとPHPStormはそれをサポートしています。

/* @var $entityManager Doctrine\ORM\EntityManager */ 
$entityManager = $this->getDoctrine()->getManager(); 

他のソリューションは、単純なヘルパーメソッドです:実際のクラスがチェックされます:上記の解決策では

public function getEntityManager(): EntityManager 
{ 
    return $this->getDoctrine()->getManager(); 
} 

我々はそうtype downcastingの一種で、サービスはORMから実際に要求されたを想定実行時にのみ。型安全性のために、エンティティマネージャをあなたのサービスに直接注入することができます。

+0

良い説明と可能な解決策へのヒント、感謝!私はもう少し待つだろうが、誰も何も上手く来なければ、私はあなたの答えを受け入れるだろう。 –

0

これを試してみてください。

$ queryBuilder =の$ this - > getDoctrine() - > getManager() - > getRepository( 'AppBundle:製品') - > createQueryBuilder( 'P'); あなたがphpstormを使用している場合は、あなたのsymfonyのプラグインを更新したり、あなたの問題は、あなたのIDEであるならば、あなたは例えば、リターンはこれとObjectRepositoryではないこと、それを伝えることができ、あなたのIDE

+0

申し訳ありませんが、私はニックピッキングしていますが、すべての後に私の質問についてです:私はこれを試す必要はありません、私はそれが働いていることを知っていると私のポイントではありません。 –

0

を無視:

/** @var ProductRepository $repository */ 
$repository = $this->getDoctrine()->getRepository('AppBundle:Product'); 
$queryBuilder = $repository->createQueryBuilder('p'); 

あなたはそれがあなたが得るものであることを知っているからです。

+0

私の問題は、私のIDEではなく、型の安全性、クリーンなコード、そしてDoctrineインターフェイスによって提供されるコントラクトを尊重することです。 –

+0

静的型付けされた言語では、ソリューションは型キャストになります。この場合、PHPでは不可能です。メソッドgetRepositoryは実際にProductRepositoryインスタンスを返していますか?あなたは契約を尊重しています。 –

+0

いいえ、ProductRepositoryというクラスもないかもしれません。私が実際に期待できるのは、与えられたエンティティタイプに対して登録されているObjectRepositoryのインスタンスです。 –

関連する問題