Gedmo树扩展-在将实体持久保存到数据库之前如何获取完整路径

时间:2019-07-01 15:19:26

标签: symfony doctrine gedmo-tree

我正在使用gedmo树扩展名来管理术语的父子层次结构。

查看gedmo TreeListener源代码,该侦听器正在侦听该原则的onFlush事件 来执行它的操作。

现在,我已将TermListener设置为侦听onFlush事件,并将其优先级设置为较低 这意味着TreeListener将在我的TermListener之前运行。

在onFlush内,我正在使用该术语的数据为每个术语创建一个symfony路由。 我现在遇到的问题是,从术语中获取完整路径会在创建新对象时返回null 字词,但在更新字词时不行。更新术语并将其设置为父项会返回完整路径,但不会返回完整路径 创建新术语并设置父项时。

有没有解决这个问题的方法。

<?php 

namespace Boab\CmsBundle\EventListener;

use Boab\CmsBundle\Entity\TermInterface;
use Boab\CmsBundle\Entity\TermRoute;
use Boab\CmsBundle\Entity\Term;
use Doctrine\ORM\Event\OnFlushEventArgs;

class TermListener
{
public function onFlush(OnFlushEventArgs $args)
{
        $em = $args->getEntityManager();
        $uow = $em->getUnitOfWork();

       $entities = array_merge(
            $uow->getScheduledEntityInsertions(),
            $uow->getScheduledEntityUpdates()
       );

    foreach ($entities as $entity) {
        if (!$entity instanceof TermInterface) {
            continue;
        }

        $route = $this->createRouteFromTerm($entity);

        $em->persist($route);
        $tmd = $em->getClassMetadata(TermRoute::class);
        $uow->computeChangeSet($tmd, $route);

        $entity->setRoute($route);
        if(!$entity->getId()){
            $md = $em->getClassMetadata(Term::class);
            $uow->recomputeSingleEntityChangeSet($md, $entity);
        }
    }
}

private function createRouteFromTerm(TermInterface $term): TermRoute
{
    $route = $term->getRoute();
    if(!$route){
        $route = new TermRoute;
        $route->setDateCreated( new \DateTime('now'));
    }
    $route->setTitle($term->getName())
        ->setSlug($term->getSlug())
        ->setPath($term->getPath())
        ->setVisibility($term->isEnabled());

    if($parent = $term->getParent()){
        $route->setParentId($parent->getRoute()->getId());
    }else{
        $route->setParentId(0) ;
    }

    return $route;
}

}

0 个答案:

没有答案