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

您需要获取一个数据库对象,对其进行编辑、持久化,然后刷新它,以便将其保存回数据库。如果不先持久化某个对象,就不能调用 flush ,这就是永远不会调用 registerSlugs 的原因。现在没有什么可以挽救的。

要更改设计,我认为您必须有另一个变量来引用您正在为其创建 slug 的实体的对象。该对象需要在数据库中有一个名为 slug 的字段,您创建 slug,然后持久化对象,然后刷新以保存它。请参阅http://symfony.com/doc/current/book/doctrine.html#a-simple-example-a-product以持久化和刷新对象。

于 2014-04-09T16:22:03.727 回答