Расширение Gedmo Tree - Как получить полный путь перед сохранением сущностей в базе данных - PullRequest
0 голосов
/ 01 июля 2019

Я использую расширение дерева гедмо для управления родительской дочерней иерархией моих терминов.

Глядя на исходный код gedmo TreeListener, слушатель прослушивает событие onFlush доктрины. выполнять свои операции.

Теперь я установил свой TermListener для прослушивания события onFlush, установил его приоритет ниже это означает, что TreeListener будет работать до моего TermListener.

Внутри onFlush я создаю маршрут Symfony для каждого термина, используя данные термина. Проблема, которую я имею сейчас, состоит в том, что получение полного пути от термина возвращает ноль при создании нового термин, но не при обновлении термина. Обновление термина и установка его родитель возвращает полный путь, но не при создании нового термина и установке родителя.

Есть ли способ обойти эту проблему.

<?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;
}

}
...