2017-04-06 77 views
1

我需要检查实体是否是特定实体的实例,并在保存新实体后执行某些操作。类似于之后的方法在cakephp中保存。我试过postFlushonFlush,postPersistpostLoad保存新实体后的Symfony事件监听器

的appbundle /事件监听/ DoSomethingAfterSaveNewEntity.php

namespace AppBundle\EventListener; 

use Doctrine\ORM\Event\OnFlushEventArgs; 
use AppBundle\Entity\SomeEntity; 

class DoSomethingAfterSaveNewEntity 
{ 
    public function onFlush(OnFlushEventArgs $args) 
    { 
     $entity = $args->getEntity(); 
     $em = $args->getEntityManager(); 
     $uow = $em->getUnitOfWork(); 

     if (!$entity instanceof SomeEntity) { 
      die('not instance!!!'); 
     } 

     die('post flush!!!'); 
     $entityManager = $args->getEntityManager(); 
    } 
} 

回答

3

你的想法是对的,但你应该创建一个新的EntityListener或EntitySubscriber。因此,实体本身并不听它的变化(坏习惯)。

services.yml

your.entity.subscriber: 
     class: AppBundle\Subscriber\YourEntitySubscriber 
     tags: 
      - { name: doctrine.event_subscriber, connection: default } 

YourEntitySubscriber.php

<?php 

namespace AppBundle\Subscriber; 

use AppBundle\Entity\YourEntity; 
use Doctrine\Common\EventSubscriber; 
use Doctrine\ORM\Event\LifecycleEventArgs; 

class YourEntitySubscriber implements EventSubscriber 
{ 
    /** 
    * @return array 
    */ 
    public function getSubscribedEvents() 
    { 
     return array(
      'postPersist', 
      'postUpdate', 
     ); 
    } 

    /** 
    * @param LifecycleEventArgs $args 
    */ 
    public function postPersist(LifecycleEventArgs $args) 
    { 
     // Do whatever you want (after entity creation) 
    } 

    /** 
    * @param LifecycleEventArgs $args 
    */ 
    public function postUpdate(LifecycleEventArgs $args) 
    { 
     // Do whatever you want 
    } 
} 

您还可以得到更多的例子在这里:event_listeners_subscribers

+1

它的工作非常感谢! – mcek