我正在尝试基于根分类单元“类别”中的分类单元构建动态菜单。这是我想要的菜单:
- A类群
- 分类单元 A1
- 分类单元 A2
- 分类群 B
- 分类群 B1
- 分类单元 B1a
- 分类单元 B1b
- 分类群 B1
我编写了一些以这种方式工作的东西:
首先,我覆盖了分类单元存储库
use Sylius\Bundle\...\TaxonRepository as BaseRepository;
class TaxonRepository extends BaseRepository
{
/**
* @return \Doctrine\Common\Collections\ArrayCollection
*/
public function findForMenu()
{
return $this
->createQueryBuilder('t')
->innerJoin('t.taxonomy', 'ta')
->innerJoin('ta.root', 'r')
->where('ta.name = :name')
->andWhere('t.parent = r')
->setParameter('name', 'Category')
->getQuery()
->getResult();
}
}
然后,我创建了一个菜单生成器
class MenuBuilder
{
private $factory;
private $repository;
public function __construct($factory, TaxonRepository $repository)
{
$this->factory = $factory;
$this->repository = $repository;
}
public function createMain(Request $request)
{
$menu = $this->factory->createItem('root');
foreach ($this->repository->findForMenu() as $taxon) {
$menu->addChild($this->buildChild($taxon));
}
return $menu;
}
private function buildChild(Taxon $taxon)
{
$item = $this->factory->createItem($taxon->getName());
foreach ($taxon->getChildren() as $child) {
$item->addChild($this->buildChild($child));
}
return $item;
}
}
它运行良好,但由于延迟加载有很多查询,所以我决定使用 ClosureTreeRepository(Gedmo)的行为。我意识到我不能这样做,因为你必须从 Sylius 的存储库继承,而你不能从 Gedmo 的 ClosureTreeRepository 继承。
关于如何通过 ORM 构建好分类单元树的任何提示?