簡體   English   中英

Symfony2-主義-更新后無變更集

[英]Symfony2 - Doctrine - no changeset in post update

因此,當實體上的某個值更改時,我正在發送電子郵件。 我只希望在更新后發送電子郵件,以防萬一更新由於某種原因而失敗。 所以在preUpdate上我可以做到這一點

public function preUpdate(LifecycleEventArgs $args){

    if ($args->hasChangedField('value') && is_null($args->getOldValue('value'))) {
        $this->sendEmail();
    }

}

但是我需要在postUpdate上執行此操作,並且由於這些方法在postUpdate上不可用,因此我將其重構為如下所示:

public function postUpdate(LifecycleEventArgs $args){

    $entity      = $args->getEntity();
    $changeSet = $args->getEntityManager()->getUnitOfWork()->getEntityChangeSet($entity);

    if ($entity  instanceof Entity && isset( $changeSet['value'] ) && empty( $changeSet['value'][0] )) {
        $this->sendEmail();
    }
}

但是,這將返回一個空的更改集,但是已進行了更改並且可以在preUpdate中看到。 誰能看到我在做什么錯? 幫助將不勝感激:)

preUpdate事件上,您將獲得PreUpdateEventArgs類的事件對象,其中已為實體設置了更改。

postUpdate您僅獲得LifecycleEventArgs類的事件對象,在postUpdate事件對象中,您僅可要求提供更新的實體(並獲取其最新狀態)。

如果要使用變更集,則需要在實際更新實體( preUpdate事件)之前進行操作。

一種解決方法是自己保存更改集,然后在postUpdate檢索它。 這是我實現過的簡化示例:

<?php

namespace Awesome\AppBundle\EventListener;

use Doctrine\Common\Cache\ArrayCache;
use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Event\PreUpdateEventArgs;
use Doctrine\ORM\Events;

/**
 * Store last entity change set in memory, so that it could be
 * usable in postUpdate event.
 */
class EntityChangeSetStorageListener implements EventSubscriber
{
    /**
     * @var ArrayCache
     */
    private $cache;

    /**
     * @param ArrayCache $cacheStorage
     */
    public function __construct(ArrayCache $cacheStorage)
    {
        $this->cache = $cacheStorage;
    }

    /**
     * Store last entity change set in memory.
     *
     * @param PreUpdateEventArgs $event
     */
    public function preUpdate(PreUpdateEventArgs $event)
    {
        $entity = $event->getEntity();

        $this->cache->setNamespace(get_class($entity));
        $this->cache->save($entity->getId(), $event->getEntityChangeSet());
    }

    /**
     * Release the memory.
     */
    public function onClear()
    {
        $this->clearCache();
    }

    /**
     * Clear cache.
     */
    private function clearCache()
    {
        $this->cache->flushAll();
    }

    /**
     * {@inheritdoc}
     */
    public function getSubscribedEvents()
    {
        return [
            Events::preUpdate,
            Events::onClear,
        ];
    }
}

稍后將ChangeSetStorage服務注入到postUpdate事件中必要的偵聽器中。

我對變更集數據有一個非常煩人的問題,有時我收到了變更的集合,有時沒有。

我通過添加以下行來進行整理: $ event-> getEntityManager()-> refresh($ entity); doctrine.event_subscriberprePersist更新前的事件

刷新行之后,更改集數據已更新,因此以下行開始工作:

/** @var array $changeSet */
$changeSet = $this->em->getUnitOfWork()->getEntityChangeSet($entity);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM