2013-02-26 47 views
11

我怎样才能做到这一点创建实体:对实体冲洗

例如,我有一个实体,称为问题。我需要记录此实体字段的更改。
如果用户更改“状态”上的问题实体我需要创建一个关于它的数据库记录与用户,谁改变了字段,以前的状态和新的状态。

使用:Symfony2 + doctrine2。

回答

18

您可以使用,一个event subscriber,并将其连接到ORM事件侦听器(在symfony中2,有docs about that):

namespace YourApp\Subscriber; 

use Doctrine\Common\EventSubscriber; 
use Doctrine\ORM\Event\OnFlushEventArgs; 
use Doctrine\ORM\Events; 
use YourApp\Entity\Issue; 
use YourApp\Entity\IssueLog; 

class IssueUpdateSubscriber implements EventSubscriber 
{ 
    public function onFlush(OnFlushEventArgs $args) 
    { 
     $em = $args->getEntityManager(); 
     $uow = $em->getUnitOfWork(); 

     foreach ($uow->getScheduledEntityUpdates() as $updated) { 
      if ($updated instanceof Issue) { 
       $em->persist(new IssueLog($updated)); 
      } 
     } 

     $uow->computeChangeSets(); 
    } 

    public function getSubscribedEvents() 
    { 
     return array(Events::onFlush); 
    } 
} 

最后,您可以检查变更,因为我已经在Is there a built-in way to get all of the changed/updated fields in a Doctrine 2 entity解释。

我离开了IssueLog的实现,因为这符合您自己的要求。

+0

是的,方式更快! – Mick 2013-02-26 15:46:32

+0

@帕特我从我的一个项目做了一些复制意大利面;) – Ocramius 2013-02-26 15:47:30

+8

@Ocramius:copy- * pasta *?你的意大利灵魂并没有放弃你! P – DonCallisto 2013-02-26 16:28:55