Doctrine2 + Symfony2保持每次插入,更新,删除的历史记录

时间:2014-08-19 08:18:11

标签: symfony doctrine-orm

我正在开发Web应用程序。最重要的功能应该是历史(版本控制)和用户批准插入的数据。这意味着用户可以查看所有历史记录更改,再次使用旧版本,验证或拒绝新版本,该版本由用户插入而不会过度。

我有一个表actionHistory(date,user,action,isValid)然后我有例如Person,Address,CustomField和CustomValue表。人多toMoMany地址。人oneToMany CustomFields。 CustomFields oneToOne CustomValue。每张桌子都有一张历史表。

E.G。当我坚持使用自定义字段值的人。我必须创建person,customfield-value历史表。将此版本复制到其中。连接所有历史表并连接actionHistory

一开始我使用了EventListener和Lifecycle Event(postPersist,postDelete,postUpdate),但主要的问题是,当我想添加前面的例子时,我总是有问题来连接这些表。我不知道哪个实体会先存在,当我尝试第二个实体还没有存在时等等。

public function postUpdate(LifecycleEventArgs $args)
{
    $entity = $args->getEntity();
    $em = $args->getEntityManager();

    if ($entity instanceof Address) {
        $this->addPersonHistory($em, $entity);
        $this->saveAddressHistory("UPDATE", $em, $entity, "Address");
    }
    if ($entity instanceof CustomField) {
        $this->addCustomFieldHistory($em, $entity);
        $this->saveCustomFieldHistory("UPDATE", $em, $entity, "CustomField");
    }
    if ($entity instanceof CustomValue) {
        $this->saveCustomValueHistory("UPDATE", $em, $entity, "CustomValue");
    }
    if ($entity instanceof Person) {
        $this->savePersonHistory("UPDATE", $em, $entity, "Person");
    }
}

这种情况有更好的解决方案吗?因为我现在被卡住了,当我不得不面对添加person-customField-customValue。

提前谢谢!

1 个答案:

答案 0 :(得分:3)

你在寻找什么(好消息)。

使用存储库提供的DoctrineExtensions Gedmo完成:https://github.com/Atlantic18/DoctrineExtensions 您需要的扩展程序是 Loggable ,并在此处进行说明:https://github.com/Atlantic18/DoctrineExtensions/blob/master/doc/loggable.md

最好的是有一个直接实现这些扩展的包:https://github.com/stof/StofDoctrineExtensionsBundle 这里的解释:https://github.com/stof/StofDoctrineExtensionsBundle/blob/master/Resources/doc/index.rst