11
我怎樣才能做到這一點創建實體:對實體沖洗
例如,我有一個實體,稱爲問題。我需要記錄此實體字段的更改。
如果用戶更改「狀態」上的問題實體我需要創建一個關於它的數據庫記錄與用戶,誰改變了字段,以前的狀態和新的狀態。
使用:Symfony2 + doctrine2。
我怎樣才能做到這一點創建實體:對實體沖洗
例如,我有一個實體,稱爲問題。我需要記錄此實體字段的更改。
如果用戶更改「狀態」上的問題實體我需要創建一個關於它的數據庫記錄與用戶,誰改變了字段,以前的狀態和新的狀態。
使用:Symfony2 + doctrine2。
您可以使用,一個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
的實現,因爲這符合您自己的要求。
是的,方式更快! – Mick 2013-02-26 15:46:32
@帕特我從我的一個項目做了一些複製意大利麪;) – Ocramius 2013-02-26 15:47:30
@Ocramius:copy- * pasta *?你的意大利靈魂並沒有放棄你! P – DonCallisto 2013-02-26 16:28:55