13

どうすればこれを達成できますか:

たとえば、Issueというエンティティがあります。このエンティティのフィールドの変更をログに記録する必要があります。ユーザーが問題
エンティティ のフィールド「ステータス」を変更した場合、フィールドを変更したユーザー、以前のステータス、および新しいステータスを使用して、それに関するデータベース レコードを作成する必要があります。

使用: Symfony2 + doctrine2。

4

1 に答える 1

21

そのためにイベントサブスクライバーを使用して、それをORMイベントリスナーにアタッチすることができます(symfony 2には、それに関するドキュメントがあります)。

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それはあなた自身の要件次第なので、私は例からの実装を残しました。

于 2013-02-26T15:42:11.057 に答える