我正在开发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。
提前谢谢!
答案 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