2016-06-14 12 views
1

こんにちは、私は、このマニュアル以下のsymfonyのイベントリスナーを行うためにトリングだ: http://symfony.com/doc/2.8/cookbook/doctrine/event_listeners_subscribers.htmlsymfonyのイベントリスナーは

<?php 

namespace FM\AppBundle\EventListener; 

use Doctrine\ORM\Event\LifecycleEventArgs; 
use FM\AdminBundle\Entity\Address\BillingAddress; 

class BillingAdressListener 
{ 
    /** 
    * @param LifecycleEventArgs $args 
    */ 
    public function listenBillingAdress(LifecycleEventArgs $args) 
    { 
     $entity = $args->getEntity(); 

     if(!$entity instanceof BillingAddress){ 
      return; 
     } 

     $this->postPersist($args); 
    } 

    /** 
    * @param LifecycleEventArgs $args 
    */ 
    public function postPersist(LifecycleEventArgs $args) 
    { 
     $em = $args->getEntityManager(); 
     $billingAdress = $args->getEntity(); 

     dump($billingAdress); die(); 
    } 
} 

service.yml

billing_adress.listener: 
     class: FM\AppBundle\EventListener\BillingAdressListener 
     tags: 
      - { name: doctrine.event_listener, event: listenBillingAdress } 

しかし、私が提出していたときに何も起こりませんBillingAddressオブジェクトを持つフォーム。

私は間違っていましたか?

+0

suscriberクラスを作成しましたか?それ以外の場合Doctrine doc:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html –

+0

あなたは 'listenBillingAdress'イベントをどのように提起しますか? –

+0

私はイベントをしていません* Suscriber *しかしイベント*リスナー* – Kevin

答えて

0

を追加することができ、私はをやっていなかったことを永続化しますが更新

パーシストと動作します。

<?php 

namespace FM\AppBundle\EventListener; 

use Doctrine\ORM\Event\LifecycleEventArgs; 
use FM\AdminBundle\Entity\Address\BillingAddress; 

class BillingAddressListener 
{ 
    /** 
    * @param LifecycleEventArgs $args 
    */ 
    public function prePersist(LifecycleEventArgs $args) 
    { 
     $entity = $args->getEntity(); 

     if(!$entity instanceof BillingAddress){ 
      return; 
     } 

     $this->addNameToUser($args); 
    } 

    /** 
    * @param LifecycleEventArgs $args 
    */ 
    public function addNameToUser(LifecycleEventArgs $args) 
    { 
     /** @var BillingAddress $billingAdress */ 
     $billingAdress = $args->getEntity(); 
     $user = $billingAdress->getOwner(); 

     if(empty($user->getFirstName())) $user->setFirstName($billingAdress->getFirstName()); 
     if(empty($user->getLastName())) $user->setLastName($billingAdress->getLastName()); 
    } 
} 

そして私はprePersistメソッドを呼び出す必要があります:ここで

は今私のコードです。 私は逆のことをしていました。

billing_address.listener: 
    class: FM\AppBundle\EventListener\BillingAddressListener 
    tags: 
     - { name: doctrine.event_listener, event: prePersist } 
0

Doctrineではエンティティリスナーと呼ばれています。ここにはdocumentationがあります。

エンティティリスナーをマッピングに追加することを忘れないでください。例のXMLマッピングの場合:

<entity name="AppBundle\Entity\AssignmentAttempt" table="app_assignment_attempt" > 
    <entity-listeners> 
     <entity-listener class="AppBundle\EntityListener\AssignmentAttemptListener"> 
      <lifecycle-callback type="prePersist" method="prePersist"/> 
      <lifecycle-callback type="preUpdate" method="preUpdate"/> 
     </entity-listener> 
    </entity-listeners> 
    <!-- Rest mapping --> 
</entity> 

設定ではあなたは、単に私の悪い

app.entity_listener.assignment_attempt: 
    class: AppBundle\EntityListener\AssignmentAttemptListener 
    tags: 
     - { name: doctrine.orm.entity_listener } 
関連する問題