Skip to content

Twig : prendre en charge les templates et le lien contrôleur vers vue #19

Closed

Description

@alexwrite

Context

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

Hors scope

  • Variables et blocs Twig ({% block %}) comme nœuds

Activity

  1. alexwrite commented on Oct 11, 2026

    @alexwrite
    OwnerAuthor

    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]).

  2. added
    enhancementNew feature or request
    p2Défaut visible par l'utilisateur
    on Oct 11, 2026
  3. github-actions commented on Oct 11, 2026

    @github-actions

    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.

  4. alexwrite commented on Oct 11, 2026

    @alexwrite
    OwnerAuthor

    Prise en charge (worktree templates, branche feat/twig-templates).

    Comparaison des deux PR amont sur les 130 templates du projet B (extraction --code-only, même base origin/main) :

    Graphify-Labs#2001 Graphify-Labs#2240
    Nœuds fichier .twig 113 / 130 (17 renommés par la désambiguïsation) 130 / 130
    extends vers le fichier réel 0 / 79 79 / 79
    include vers le fichier réel 0 / 22 22 / 22

    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é.

    Périmètre de fichiers visé :

    • graphify/extractors/twig.py, graphify/extractors/base.py, graphify/extractors/resolution.py
    • nouveau module partagé pour les appels PHP qui rendent un template (graphify/extractors/php_views.py), branché dans graphify/extractors/engine.py
    • graphify/extract.py, graphify/detect.py, graphify/extractors/__init__.py
    • tests/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).

  5. alexwrite commented on Oct 11, 2026

    @alexwrite
    OwnerAuthor

    Fait

    • 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.
    • PR : feat: Twig templates and controller-to-template links #33.

    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_root et _resolve_path_ref pour la résolution fail-closed.
    • 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.
    • graphify/cache.py : schéma du cache AST 8 vers 9.
    • Tests : tests/test_twig.py (5 tests de résolution ajoutés), tests/test_languages.py + tests/fixtures/symfony_views/.

    Pourquoi ce choix

    Apprentissages

    • 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.

    Faiblesses restantes

    Quality

    • Tests : 7550 passed, 14 skipped (suite complète)
    • Analyse statique : pyright, 0 nouvelle erreur sur les modules touchés (199 sur la branche, 199 sur origin/main)
    • Linter : ruff check . sans erreur
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestp2Défaut visible par l'utilisateur

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions