Я пытаюсь отобразить дерево ссылок, используя ассоциативную ссылку Doctrine.У меня есть объект вроде:
<?php
namespace App\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Table(name="link")
* @ORM\Entity(repositoryClass="App\Repository\LinkRepository")
*/
class Link
{
/**
* @ORM\Column(name="link_id", type="integer", nullable=false, options={"unsigned"=true})
* @ORM\Id()
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $linkId;
/**
* @ORM\Column(name="name", type="string", length=50)
*/
private $name;
/**
* @ORM\Column(name="url", type="string", length=500)
*/
private $url;
/**
* @ORM\Column(name="parent_id", type="integer")
*/
private $parentId;
/**
* @ORM\OneToMany(targetEntity="Link", mappedBy="parent")
*/
private $children;
/**
* @ORM\ManyToOne(targetEntity="Link", inversedBy="children")
* @ORM\JoinColumn(name="parent_id", referencedColumnName="link_id")
*/
private $parent;
public function __construct()
{
$this->children = new ArrayCollection();
}
public function getLinkId(): ?int
{
return $this->linkId;
}
// Getters and setters ...
/**
* @return ArrayCollection
*/
public function getChildren()
{
return $this->children;
}
}
, и в моем контроллере он получает ссылку и вызывает шаблон ветки, например:
public function link(int $linkId, LinkRepository $linkRepository)
{
$link = $linkRepository->findOneBy(['linkId' => $linkId]);
return $this->render('link.html.twig',
[
'link' => $link
]);
}
И шаблон ветки выглядит примерно так:
{% extends 'base.html.twig' %}
{% block body %}
{{ link.name }}
<h2>Children:</h2>
{% import _self as macros %}
<ul>
<li>{{ link.name }}
{{ macros.link_tree(link) }}
</li>
</ul>
{% endblock %}
{% macro link_tree(link) %}
{% import _self as macros %}
<ul>
{% for linkChild in link.children %}
<li>
{{ link.name }}
{% if linkChild.children %}
<ul>
{{ macros.link_tree(linkChild.children) }}
</ul>
{% endif %}
</li>
{% endfor %}
</ul>
{% endmacro %}
Хотя, когда я вызываю этот контроллер, он выдает мне эту ошибку:
Ни свойство "children", ни один из методов "children ()", "getchildren () "/" ischildren () "/" haschildren () "или" __call () "существуют и имеют открытый доступ в классе" Doctrine \ ORM \ PersistentCollection ".
Это, кажется, когда ясделайте ссылку на linkChild.children в шаблоне ветки.
Как я могу рекурсивно зацикливаться на children () в ветке?