2017-02-01 20 views
1

EntityListenerはサービスとして登録されているため、同じクラスを異なる引数で複数回登録し、それぞれを特定のエンティティに関連付けることは可能ですか?異なるサービス引数を持つ複数のエンティティに同じEntityListenerを使用

/** 
* Class EntityA 
* @ORM\Entity 
* @ORM\EntityListeners({"myBundle\EventListener\SharedListener"}) 
*/ 
class EntityA implements sharedBehaviourInterface 
{ 
    // stuff here 
} 

/** 
* Class EntityB 
* @ORM\Entity 
* @ORM\EntityListeners({"myBundle\EventListener\SharedListener"}) 
*/ 
class EntityB implements sharedBehaviourInterface 
{ 
    // stuff here 
} 

私はこのように、前のエンティティの両方のために、以下のリスナーを登録したいと思います:

class SharedListener 
{ 
    private $usefulParameter; 

    public function __construct($usefulParameter) 
    { 
     $this->usefulParameter = $usefulParameter; 
    } 

    /** 
    * @PrePersist 
    * 
    */ 
    public function prePersist(sharedBehaviourInterface $dbFile, LifecycleEventArgs $event) 
    { 
     // code here 
    } 

    // more methods 
} 

使用:

mybundle.entitya.listener: 
    class: myBundle\EventListener\SharedListener 
    arguments: 
     - '%entitya.parameter%' # The important change goes here ... 
    tags: 
     - { name: doctrine.orm.entity_listener } 
mybundle.entityb.listener: 
    class: myBundle\EventListener\SharedListener 
    arguments: 
     - '%entityb.parameter%' # ... and here 
    tags: 
     - { name: doctrine.orm.entity_listener } 

をそれにはない以下のエンティティを考慮

私は実際にエンティティターゲットのEntityListener宣言が驚いています彼はサービスではなく、リスナークラスです。代わりに特定のサービスをターゲットに設定できますか? Like:

@ORM\EntityListeners({"mybundle.entityb.listener"}) 

私がしようとしていることは可能でもありませんか?

答えて

1

@configured_service_id表記のサービスに他のサービスを注入することができます。これは、コンストラクタ引数とセッタ注入のために機能します。

一般的に話されていますが、必要がない場合は抽象化を見つけようとしないでください。 ほとんどの場合、コードの重複は長期的にははるかに容易です。

私は単純に目的ごとに2つの独立したリスナーを作成します。エンティティは、同じリスナーで処理しなければならない2つのエンティティのいずれでもない場合

はハンドラの飛び出し簡単なチェックを行います。

<?php 
use Doctrine\Common\Persistence\Event\LifecycleEventArgs; 

class MyEventListener 
{ 
    public function preUpdate(LifecycleEventArgs $args) 
    { 
     $entity = $args->getObject(); 
     $entityManager = $args->getObjectManager(); 

     if (!$entity instanceof EntityA && !$entity instanceof EntityB) { 
      return; 
     } 

     /* Your listener code */ 
    } 
} 
+0

サービスに他のサービスを注入することはどういう意味ですか?私は "あまりにも多くの抽象化をしないでください"という考えに同意します。他のオプションがない場合、私はこれを行うでしょうが、多分私の主な質問は次のようなものでなければなりません:複数のクラス間で持続性の挙動をどのように共有できますか? –

+0

すべてのリスナは、すでにすべてのエンティティに対して実行されます。異なるエンティティで同じ作業をするために2人のリスナーが必要ありません。 – mblaettermann

0

はよろしいです、これはしないだろうトリック:

public function prePersist(sharedBehaviourInterface $dbFile, LifecycleEventArgs $event) 
{ 
    $entity = $event->getObject(); 

    if ($entity instanceof ClassA) { 
     // Do something 
    } elseif ($entity instanceof ClassB) { 
     // Something else 
    } else { 
     // Nah, none of the above... 
     return; 
    } 
} 
関連する問題