Affichage d'une arborescence

Voici une arborescence constituée d'une entité Catégorie ayant les propriétés suivantes :

Dans le contrôleur, on récupère d'abord toutes les catégories de niveau supérieur, c-à-d celles dont le parent est null.

MonControleur.php
public function categories(CategoriesRepository $repo) {
 
    // Lire toutes les catégories de niveau supérieur
    $categs = $repo->findByParent(null);
 
    // Envoyer ces catégories au template Twig
    return $this->render('mon_controleur/liste_categories.html.twig', [
        'categories' => $categs
    ]);
}

Le code Twig ci-dessous utilise une macro qui sera appelée récursivement pour afficher les catégories et leurs enfants.

À chaque boucle for, les élements sont triés (filtre sort) sur base de leur propriété ordre.

mon_controleur/liste_categories.html.twig
{% extends 'base.html.twig' %}
 
{% macro afficheCateg(categorie) %}
    <ul>
        <li>#{{categorie.ordre}} : {{categorie.id}}. {{categorie.denom}}</li>
        {% for enfant in categorie.enfants | sort((a, b) => a.ordre <=> b.ordre) %}
            {{ _self.afficheCateg(enfant) }}
        {% endfor %}
    </ul>
{% endmacro %}
 
{% block body %}
<h1>Catégories</h1>
 
{% for categorie in categories | sort((a, b) => a.ordre <=> b.ordre) %}
  {{ _self.afficheCateg(categorie) }}
{% endfor %}
 
{% endblock %}