0

私はpreUpdateを構築しようとしています.postUpdateでそれを行っていましたが、フィールドに関係なく、そのエンティティの編集が行われるたびに変更していたという事実を考えていませんでした.代わりに preUpdate を使用してください...

これは私の preUpdate リスナーです:

namespace Prizes\PrizesBundle\EventListener;

use Doctrine\ORM\Event\LifecycleEventArgs;
use Prizes\PrizesBundle\Entity\Prize;
use Prizes\CatalogBundle\Entity\CatalogHasPrize as CHP;

/**
 * Description of DeactivatePrizesInCatalog
 *
 * @author Victoria Noguera
 * Desactiva premios en catalogos cuando se desactiven en el prize central.
 */
/**
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 */
class DeactivatePrizesInCatalog {
/**
     * @ORM\PrePersist()
     * @ORM\PreUpdate()
     */
    public function preUpdate(LifecycleEventArgs $args) {
       $entity = $args->getEntity();
        $entityManager = $args->getEntity

Manager();
    if ($entity instanceof Prize) {
        if ($args->hasChangedField('status')) {
            $status_new = $args->getNewValue('status');
            if ($status_new->getName() == "Inactive") {
                $statusinactive = $entityManager->getRepository('AppStatusBundle:Status')->find(8);
                $q = $entityManager->createQuery("UPDATE CatalogBundle:CatalogHasPrize c SET c.status = :statusid WHERE c.status = 7 AND c.prize = :prizeid")
                        ->setParameters(array('statusid' => $statusinactive, 'prizeid' => $entity->getId()));
                $rs = $q->getResult();
            } else if ($status_new->getName() == "Active") {
                $statusinactive = $entityManager->getRepository('AppStatusBundle:Status')->find(7);
                $q = $entityManager->createQuery("UPDATE CatalogBundle:CatalogHasPrize c SET c.status = :statusid WHERE c.status = 8 AND c.prize = :prizeid")
                        ->setParameters(array('statusid' => $statusinactive, 'prizeid' => $entity->getId()));
                $rs = $q->getResult();
            }
        }
    }
}

}

これがconfig.ymlファイルで行っている方法です(services.ymlに入っていると読んだだけですが、後で変更します)

services:
    preupdate.listener:
        class: Prizes\PrizesBundle\EventListener\DeactivatePrizesInCatalog
        tags: 
             - { name: doctrine.event_listener , event: preUpdate }

ただし、これを行うと、プロジェクトは完全に機能しなくなり、503 サービスが利用できなくなります。クラッシュと書いただけでもpublic function preUpdate(LifecycleEventArgs $args) { }設定の問題を想定しているのですが、どこが悪いのかさっぱりわかりません。

提供されたヘルプに感謝します。ありがとうございました

4

1 に答える 1

0

それ自体がエンティティではないリスナーにマッピング情報を追加しています。

/**
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 */

と ...

/**
 * @ORM\PrePersist()
 * @ORM\PreUpdate()
 */

... リスナー クラスに含めないでください。

エンティティ自体に prePersist メソッドが含まれている場合、これらのアノテーションをエンティティで使用できます。

于 2013-08-01T18:46:00.633 に答える