Ответ 1
Вы можете использовать подписчик событий для этого и присоединить его к слушателю событий ORM (в symfony 2, there документы об этом):
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);
}
}
Вы можете в конце концов проверить набор изменений, как я объяснил в Есть ли встроенный способ получить все измененные/обновленные поля в объекте Doctrine 2?.
Я оставил реализацию IssueLog
из примера, так как это соответствует вашим собственным требованиям.