在实体刷新上创建实体

ide*_*eea 11 symfony doctrine-orm

我怎样才能做到这一点:

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

使用:Symfony2 + doctrine2.

Ocr*_*ius 20

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

您最终可以检查变更集,因为我已经解释过是否有内置方法来获取Doctrine 2实体中的所有已更改/更新字段.

我离开了IssueLog示例中的实现,因为这取决于您自己的要求.

  • @Ocramius:copy-*pasta*?你的意大利灵魂没有放弃你!P (8认同)