我正在使用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;
}
}