2011-11-16 8 views
4

エンティティを永続化する前に、私のDBの別のテーブルにデータをコピーしてフォーマットする必要があります。私はこのタスクをサービスとして実行します。 だから、私はこのサービスを呼び出すための最良の方法を思っていたconfig.ymlSymfony2での依存性注入のベストプラクティス

services: 
my_service: 
    class: Acme\Bundle\AcmeBundle\DependencyInjections\MyService 
    arguments: 
     entityManager: "@doctrine.orm.entity_manager" 

でサービスを記述する。私が把握できる唯一の方法はコントローラからです:

$entity = new Entity($this->get('my_service')); 

これは最善の方法ですか?

答えて

7

あなたのサービスmy_serviceは、あなたのエンティティを永続化する前にやりたいことです。それはprePersistイベントによってトリガーされなければならないサービスです。

だから、私はこのサービスを教義のリスナーに変えるだけです。

services: 
    my_service: 
     class: Acme\Bundle\AcmeBundle\DependencyInjections\MyService 
     arguments: 
      entityManager: "@doctrine.orm.entity_manager" 
     tags: 
      - { name: doctrine.event_listener, event: prePersist } 

MyServiceクラスでは、実行するすべての目的でprePersistメソッドを定義する必要があります。

use Doctrine\ORM\Event\LifecycleEventArgs; 

class MyService 
{ 
    public function prePersist(LifecycleEventArgs $args) 
    { 
     $entity = $args->getEntity(); 
     $entityManager = $args->getEntityManager(); 
     (...) 
    } 
} 

LifecycleEventArgsがエンティティマネージャを取得する方法を提供するため、サービスの引数を削除することもできます。

最後に、あなたはこのリスナー

services: 
    my_service: 
     class: Acme\Bundle\AcmeBundle\DependencyInjections\MyService 
     tags: 
      - { name: doctrine.event_listener, event: prePersist } 

を持っている私は、それは完全に質問に答える、これはあなたの質問

+0

に答える願っています!ありがとうたくさん –

+0

あなたはこの答えが正しいとマークする必要があります。 –