在Doctrine 2中坚持事件的对象

时间:2013-07-04 09:52:47

标签: php doctrine-orm

在我的应用中保存实体时,我想将其slug字段添加到查找表中。为了尽可能减少干扰,我写了一个事件订阅者。根据{{​​3}},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,无论是更新还是新插入。

我哪里出错了?

1 个答案:

答案 0 :(得分:0)

您需要获取数据库对象,编辑它,保留它,然后刷新它以便将其保存回数据库。如果没有先保留一些对象就不能调用flush,这就是为什么从不调用registerSlugs的原因。现在没有什么可以保存的。

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