在实体刷新上创建实体

时间:2013-02-26 15:30:15

标签: symfony doctrine-orm

我怎样才能做到这一点:

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

使用:Symfony2 + doctrine2。

1 个答案:

答案 0 :(得分:19)

您可以使用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的实现,因为这符合您自己的要求。