【问题标题】:Persist an Object on Event in Doctrine 2在 Doctrine 2 中持久化一个对象
【发布时间】:2013-07-02 06:41:41
【问题描述】:

当一个实体保存在我的应用程序中时,我想将其slug 字段添加到查找表中。为了尽可能减少干扰,我编写了一个事件订阅者。根据this post,我不能在postUpdate事件上INSERT,所以我尝试了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,无论是在更新还是新插入时。

我哪里做错了?

【问题讨论】:

    标签: php doctrine-orm


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-14
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      相关资源
      最近更新 更多