You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Twig : prendre en charge les templates et le lien contrôleur vers vue #19
Twig n'est pas pris en charge : sur projet B, 0 nœud pour 129 templates .twig. La chaîne d'une application Symfony (Route -> Controller -> Service -> Repository, rendu par la vue) est donc coupée côté vue.
User story
En tant qu'agent qui modifie un template Twig, je veux savoir quels contrôleurs le rendent et quels templates l'incluent, afin de ne pas casser une page que je n'ai pas ouverte.
Acceptance criteria
Chaque template .twig est un nœud, identifié par son chemin réel
Liens extends, includes, embeds entre templates ({% extends %}, {% include %}, {% embed %}, {{ include() }}), résolus vers le fichier réel
Lien contrôleur -> template pour $this->render('a/b.html.twig') et #[Template('...')]
Un nom de template dynamique (variable) ne crée aucun lien (fail-closed)
Fixtures et tests dans tests/test_languages.py
Hints
Modèle existant : graphify/extractors/blade.py
Enregistrer l'extension dans extract.py, detect.py (CODE_EXTENSIONS), watch.py (_WATCHED_EXTENSIONS), cf. ARCHITECTURE.md
Plan : comparer les deux sur les 129 templates d'projet B, intégrer la meilleure dans notre main, puis ajouter ce qu'aucune ne fait (à vérifier) : le lien contrôleur vers template (render(), #[Template]).
Graphify-Labs#2001 crée pour chaque cible résolue un nœud au même identifiant que le fichier réel : la désambiguïsation les sépare et le lien part vers une copie. Retenue : Graphify-Labs#2240, partie Twig seule (le SCSS est une autre préoccupation), auteur conservé.
À ajouter : lien contrôleur vers template (render, renderView, renderBlock, renderBlockView, #[Template]), résolution fail-closed (pas de résolution relative au fichier courant, @Namespace/ résolu seulement quand la source le permet).
Les templates .twig sont extraits : 130 nœuds sur 130 pour le projet B.
extends, include, embed, import, from, use et include() pointent vers le nœud du fichier réel : 79/79 extends et 22/22 include sur le projet B. Un nom dynamique (screen.templates ~ '...') ne crée aucun lien.
Lien contrôleur vers template renders pour render(), renderView(), renderBlock(), renderBlockView() et #[Template] : 44 liens sur le projet B, soit toutes les paires (fichier, méthode, template) des 51 appels littéraux.
graphify/extractors/resolution.py : renders ajouté aux relations dont la cible est un fichier.
graphify/extractors/php_views.py (nouveau) : détection des appels et attributs qui rendent un template, table moteur vers résolveur, construction de l'arête.
graphify/extractors/engine.py : branchement dans le parcours des appels PHP et sur les méthodes (attribut), renders admis comme arête inter-fichiers.
Résolution par la racine du chargeur uniquement : Twig ne résout jamais un nom par rapport au fichier courant (doc Symfony : « relative file path from templates/ »). Alternative écartée : garder l'essai dans le dossier du fichier, qui faisait gagner un fichier homonyme voisin.
@Namespace/ Symfony laissé en nœud isolé : il désigne un bundle ou un chemin configuré invisible depuis le template. Alternative écartée (celle de feat(extract): add Twig and SCSS extractors Graphify-Labs/graphify#2240) : retirer le préfixe et chercher dans les templates de l'application, ce qui lie au mauvais fichier.
Le nettoyage des arêtes de l'extracteur générique jette toute arête dont la cible n'est pas dans le fichier, sauf les imports : une nouvelle relation inter-fichiers doit y être admise explicitement.
Le worktree de mesure s'appelait templates : la règle « ancêtre nommé templates » s'appliquait aussi aux fichiers PHP. Elle est désormais réservée aux fichiers .twig (test dédié).
/tmp est partagé entre agents : une première suite complète a échoué par quota disque (OSError: [Errno 122]), sans lien avec le code ; relancée verte.
Activity
alexwrite commentedon Oct 11, 2026
Commentaire d'origine du 2026-10-11, repris lors du retrait de noms de projets privés.
Analyse de l'amont (2026-10-11) : deux PR Twig déjà ouvertes, sans revue depuis juillet.
Graphify-Labs/graphify#2001: extracteur Twig seul (+306, 6 fichiers)Graphify-Labs/graphify#2240: Twig + SCSS (+1 030, 10 fichiers)Plan : comparer les deux sur les 129 templates d'projet B, intégrer la meilleure dans notre
main, puis ajouter ce qu'aucune ne fait (à vérifier) : le lien contrôleur vers template (render(),#[Template]).github-actions commentedon Oct 11, 2026
Thanks for opening this issue, @alexwrite. A maintainer will take a look soon.
If you would like to discuss it in real time, come say hi on our Discord server. For longer-form questions and ideas there is also GitHub Discussions.
To help us triage, please make sure the report includes what you expected, what actually happened, and the steps (and a small sample) to reproduce it.
alexwrite commentedon Oct 11, 2026
Prise en charge (worktree
templates, branchefeat/twig-templates).Comparaison des deux PR amont sur les 130 templates du projet B (extraction
--code-only, même baseorigin/main) :.twigextendsvers le fichier réelincludevers le fichier réelGraphify-Labs#2001 crée pour chaque cible résolue un nœud au même identifiant que le fichier réel : la désambiguïsation les sépare et le lien part vers une copie. Retenue : Graphify-Labs#2240, partie Twig seule (le SCSS est une autre préoccupation), auteur conservé.
Périmètre de fichiers visé :
graphify/extractors/twig.py,graphify/extractors/base.py,graphify/extractors/resolution.pygraphify/extractors/php_views.py), branché dansgraphify/extractors/engine.pygraphify/extract.py,graphify/detect.py,graphify/extractors/__init__.pytests/test_twig.py,tests/test_languages.py,tests/fixtures/À ajouter : lien contrôleur vers template (
render,renderView,renderBlock,renderBlockView,#[Template]), résolution fail-closed (pas de résolution relative au fichier courant,@Namespace/résolu seulement quand la source le permet).alexwrite commentedon Oct 11, 2026
Fait
.twigsont extraits : 130 nœuds sur 130 pour le projet B.extends,include,embed,import,from,useetinclude()pointent vers le nœud du fichier réel : 79/79extendset 22/22includesur le projet B. Un nom dynamique (screen.templates ~ '...') ne crée aucun lien.renderspourrender(),renderView(),renderBlock(),renderBlockView()et#[Template]: 44 liens sur le projet B, soit toutes les paires (fichier, méthode, template) des 51 appels littéraux.Comment
graphify/extractors/twig.py: extracteur de feat(extract): add Twig and SCSS extractors Graphify-Labs/graphify#2240 (partie Twig, auteur conservé), puis_twig_loader_rootet_resolve_path_refpour la résolution fail-closed.graphify/extractors/resolution.py:rendersajouté aux relations dont la cible est un fichier.graphify/extractors/php_views.py(nouveau) : détection des appels et attributs qui rendent un template, table moteur vers résolveur, construction de l'arête.graphify/extractors/engine.py: branchement dans le parcours des appels PHP et sur les méthodes (attribut),rendersadmis comme arête inter-fichiers.graphify/cache.py: schéma du cache AST 8 vers 9.tests/test_twig.py(5 tests de résolution ajoutés),tests/test_languages.py+tests/fixtures/symfony_views/.Pourquoi ce choix
target_filesur l'arête sans créer de nœud.templates/»). Alternative écartée : garder l'essai dans le dossier du fichier, qui faisait gagner un fichier homonyme voisin.@Namespace/Symfony laissé en nœud isolé : il désigne un bundle ou un chemin configuré invisible depuis le template. Alternative écartée (celle de feat(extract): add Twig and SCSS extractors Graphify-Labs/graphify#2240) : retirer le préfixe et chercher dans les templates de l'application, ce qui lie au mauvais fichier.php_views.py) avec une table moteur vers résolveur : Blade (Blade : résoudre les vues vers le fichier réel et relier les contrôleurs #4) s'y branche sans second système.Apprentissages
templates: la règle « ancêtre nommétemplates» s'appliquait aussi aux fichiers PHP. Elle est désormais réservée aux fichiers.twig(test dédié)./tmpest partagé entre agents : une première suite complète a échoué par quota disque (OSError: [Errno 122]), sans lien avec le code ; relancée verte.Faiblesses restantes
<twig:Nom>non reliés (environ 380 usages sur le projet B) : Twig : relier les composants <twig:Nom> à leur template #35.graphify affectedne suit niincludesnirenders: affected : suivre les liens includes et renders des templates #36.twig.yaml(default_path,paths) non lu : Vues : chemins ajoutés à l'exécution et Twig configuré dans twig.yaml non modélisés #38.TemplatedEmail::htmlTemplate()non suivi : Symfony : relier TemplatedEmail::htmlTemplate() et textTemplate() au template #39.#[Template]est reconnu par son nom court : un attribut maison homonyme serait pris, borné par l'exigence d'un fichier.twigexistant._AST_CACHE_SCHEMAet le CHANGELOG, à résoudre à la fusion.Quality
7550 passed, 14 skipped(suite complète)origin/main)ruff check .sans erreurMerge: Twig templates and controller-to-template links (#19)