0

slugエンティティがアプリに保存されたら、そのフィールドをルックアップ テーブルに追加したいと考えています。これをできるだけ邪魔にならないようにするために、イベントサブスクライバーを作成しました。この投稿によると、私INSERTはイベントに参加できないpostUpdateので、試しましたpostFlush

class SlugsSubscriber implements EventSubscriber {
    public function getSubscribedEvents() {
        return array('postFlush');
    }

    public function postFlush(PostFlushEventArgs $args) {
        $em = $args->getEntityManager();
        $needsFlush = false;

        error_log("postFlush");

        foreach ($em->getUnitOfWork()->getScheduledEntityInsertions() as $entity) {
            // To prevent short-circuit
            $tmp = $this->registerSlugs($entity, $entityManager);
            if($tmp) $needsFlush = true;
        }

        foreach ($em->getUnitOfWork()->getScheduledEntityUpdates() as $entity) {
            // To prevent short-circuit
            $tmp = $this->registerSlugs($entity, $entityManager);
            if($tmp) $needsFlush = true;
        }

        if($needsFlush) {
            error_log("Flushing");
            $em->flush();
        }
    }

    protected function registerSlugs($entity, EntityManager $entityManager) {
                    error_log("register slugs");
        if($entity instanceof Product) {
            $this->registerProductSlugs($entity, $entityManager);
                            return true;
        } elseif($entity instanceof Category) {
            $this->registerCategorySlugs($entity, $entityManager);
                            return true;
        }
                    return false;
    }
}

ただし、エンティティを保存しようとするregisterSlugsと、更新時でも新しい挿入時でも、メソッドは呼び出されません。

どこで私は間違えましたか?

4

1 に答える 1

0

データベース オブジェクトを取得し、編集し、永続化してから、データベースに保存されるようにフラッシュする必要があります。最初にいくつかのオブジェクトを永続化せずにフラッシュを呼び出すことはできません。これが registerSlugs が呼び出されない理由です。救われるものは今のところありません。

デザインを変更するには、スラッグを作成しているエンティティのオブジェクトを参照する別の変数が必要だと思います。このオブジェクトには、slug と呼ばれるデータベース内のフィールドが必要です。slug を作成し、オブジェクトを永続化し、フラッシュして保存します。オブジェクトの永続化とフラッシュについてはhttp://symfony.com/doc/current/book/doctrine.html#a-simple-example-a-productを参照してください。

于 2014-04-09T16:22:03.727 に答える