在实体刷新上创建实体



如何做到这一点:

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

使用:Symfony2 + doctrine2.

您可以为此使用事件订阅者,并将其附加到ORM事件侦听器(在symfony 2中,有关于此的文档):

namespace YourAppSubscriber;
use DoctrineCommonEventSubscriber;
use DoctrineORMEventOnFlushEventArgs;
use DoctrineORMEvents;
use YourAppEntityIssue;
use YourAppEntityIssueLog;
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);
    }
}

您最终可以检查变更集,正如我在"是否有一种内置的方法来获取Doctrine 2实体中所有更改/更新的字段"中所解释的。

我将IssueLog的实现从示例中删除,因为这取决于您自己的需求。

最新更新