我怎样才能做到这一点:
例如,我有一个名为 Issue 的实体。我需要记录这个实体字段的变化。
如果用户更改问题实体上的字段“status”,我需要与用户创建一个关于它的数据库记录,用户更改了字段,以前的状态和新的状态。
使用:Symfony2 + doctrine2。
答案 0 :(得分:19)
您可以使用event subscriber,并将其附加到ORM事件监听器(在symfony 2中,有docs about that):
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);
}
}
您最终可以按照我在Is there a built-in way to get all of the changed/updated fields in a Doctrine 2 entity处解释的那样检查变更集。
我离开了示例中IssueLog
的实现,因为这符合您自己的要求。