2011-09-17 18 views
15

GameRepositoryと呼ばれる関連するリポジトリを持つGameというエンティティがあります。エンティティからリポジトリを取得する方法は?

/** 
* @ORM\Entity(repositoryClass="...\GameRepository") 
* @ORM\HasLifecycleCallbacks() 
*/ 
class Game { 
    /** 
    * @ORM\prePersist 
    */ 
    public function setSlugValue() { 
     $this->slug = $repo->createUniqueSlugForGame(); 
    } 
} 

prePersistメソッドでは、ゲームのスラッグフィールドがデータベースクエリを必要とする固有のものであることを確認する必要があります。クエリを実行するには、私はEntityManagerへのアクセスが必要です。 GameRepositoryの中からEntityManagerを取得できます。だから:ゲームからGameRespositoryを取得するにはどうしたらいいですか?

答えて

9

あなたはしません。 Doctrine 2のエンティティは、ではなく、エンティティマネージャまたはリポジトリのことを知っています()。

あなたが提示する場合の典型的な解決策は、新しいインスタンスを作成する(または呼び出す)ために使用されるメソッドをリポジトリ(またはサービスクラス)に追加することです。

+2

なぜ彼らはそうすることを選択しましたか?すべてを著しく困難にし、ドライを減らすように見える。 –

+0

@JasonSwettええ、スラッグケースはちょっと迷惑なものです。他のほとんどのケースでは、テストするときなど、分離が難しい場合があります。 –

+1

"新しいインスタンスを作成する"ためのリポジトリ内のメソッド...本当ですか?リポジトリはデータを取得するだけではありませんか? – Jean

1

単純なprePersistライフサイクルイベントではなく、エンティティを保存する方法を変更することなくロジックをカプセル化するには、より強力なDoctrineイベントを使用する必要があります。エンティティ自体。

あなたが必要とするかもしれないDoctrineSluggableBundleまたはStofDoctrineExtensionsBundleバンドルを見てください。

4

あなたは (JMSDiExtraBundleを使用して)あなたのエンティティで を教義のエンティティ・マネージャを注入することができますし、このようなリポジトリいる:あなたが実際にリポジトリを取得することができますhttp://jmsyst.com/bundles/JMSDiExtraBundle/1.1/annotations

48

/** 
* @InjectParams({ 
*  "em" = @Inject("doctrine.orm.entity_manager") 
* }) 
*/ 
    public function setInitialStatus(\Doctrine\ORM\EntityManager $em) { 


    $obj = $em->getRepository('AcmeSampleBundle:User')->functionInRepository(); 
    //... 
} 

はこれを見ますライフサイクルコールバック中にのみ使用できます。あなたはそれにとても近く、LifecycleEventArgsパラメータを受け取るだけです。

またhttp://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html

use Doctrine\ORM\Event\LifecycleEventArgs; 

/** 
* @ORM\Entity(repositoryClass="...\GameRepository") 
* @ORM\HasLifecycleCallbacks() 
*/ 
class Game { 
    /** 
    * @ORM\prePersist 
    */ 
    public function setSlugValue(LifecycleEventArgs $event) { 
     $entityManager = $event->getEntityManager(); 
     $repository = $entityManager->getRepository(get_class($this)); 

     $this->slug = $repository->createUniqueSlugForGame(); 
    } 
} 

PSを参照してください。私はこれが古い質問だと知っていますが、将来のグーグルーガーを助けるために回答しました。

+5

あなたはそれを復活させてうれしく思います。私は将来のGoogle社員の一人でした。私は実際にライフサイクルのコールバック内ですでに作業していて、関連オブジェクトの作成や取得に依存してオブジェクトを保持していました。 – nealio82

+2

私のために働く(Symfony 2.4)、私はこれが受け入れられる答えだろうと思っています! – mboullouz

+0

将来のgoogler - > – Prof83

関連する問題