我想跟踪对一个Doctrine实体字段的更改。我使用Symfony 2.5.0和Doctrine 2.2.3。
到目前为止,我有一个EventSubscriber
订阅了preUpdate
。在这里,我想创建一个新实体,该实体存储新值和旧值,并保存对已更新实体的引用。
问题是,我找不到持久化此新实体的方法。如果我persist()
中的preUpdate
和flush()
中的postUpdate
,则仅更改一个实体就可以工作。如果更改了多个实体,则会收到一个错误消息,指出变更集为空。
我尝试摆弄具有不同结果的不同事件。空白页,跟踪实体不会保留等。
我认为这应该是一个常见的用例-但我找不到示例。
您可能对public function onFlush(OnFlushEventArgs $args) {
$entityManager = $args->getEntityManager();
$unitOfWork = $entityManager->getUnitOfWork();
$updatedEntities = $unitOfWork->getScheduledEntityUpdates();
foreach ($updatedEntities as $updatedEntity) {
if ($updatedEntity instanceof YourEntity) {
$changeset = $unitOfWork->getEntityChangeSet($updatedEntity);
if (array_key_exists('someFieldInYourEntity', $changeset)) {
$changes = $changeset['someFieldInYourEntity'];
$previousValueForField = array_key_exists(0, $changes) ? $changes[0] : null;
$newValueForField = array_key_exists(1, $changes) ? $changes[1] : null;
if ($previousValueForField != $newValueForField) {
$yourChangeTrackingEntity = new YourChangeTrackingEntity();
$yourChangeTrackingEntity->setSomeFieldChanged($previousValueForField);
$yourChangeTrackingEntity->setSomeFieldChangedTo($newValueForField);
$entityManager->persist($yourChangeTrackingEntity);
$metaData = $entityManager->getClassMetadata('YourNameSpace\YourBundle\Entity\YourChangeTrackingEntity');
$unitOfWork->computeChangeSet($metaData, $yourChangeTrackingEntity);
}
}
}
}
}
感兴趣。
它允许配置应跟踪的实体。然后,它介绍了数据库revisions的概念。每个修订版都有时间戳,用户名和受影响的实体列表。
然后,您可以找到影响特定实体的所有修订:
EntityAudit bundle
或在特定版本中实例化:
$revisions = $auditReader->findRevisions('AppBundle\Entity\Article', 1);
因此您可以轻松比较实体的当前状态和旧状态。
该捆绑包还附带示例视图,演示如何显示修订列表,比较不同版本的对象等等。>>
$oldArticle = $auditReader->find(
'AppBundle\Entity\Article',
$id = 1,
$rev = 2
);