Skip to content

Blade : résoudre les vues vers le fichier réel et relier les contrôleurs #4

Closed

Description

@alexwrite

Context

L'extracteur Blade relie les templates entre eux, mais :

  • les cibles de @extends('layouts.app') deviennent un nœud layouts/app qui n'est pas le fichier réel resources/views/layouts/app.blade.php ;
  • l'appel view('admin.invoices.show') côté contrôleur ne crée aucun lien.

Constaté sur ClientXCMS (350 templates Blade).

User story

En tant qu'agent qui modifie une vue Blade, je veux savoir quels contrôleurs la rendent, afin de mesurer l'impact sur les pages.

Acceptance criteria

  • @extends, @include pointent vers le nœud du fichier réel sous le dossier de vues
  • Lien contrôleur -> vue pour view('...'), View::make('...'), response()->view('...')
  • Nom de vue dynamique : aucun lien
  • Tests de régression qui échouent avant le correctif

Hints

  • graphify/extractors/blade.py:26 et suivantes : tgt.replace(".", "/") sans résolution de dossier

Hors scope

  • Vues des addons (cf. issue liens symboliques)

Activity

  1. added
    bugSomething isn't working
    p2Défaut visible par l'utilisateur
    on Oct 11, 2026
  2. alexwrite commented on Oct 11, 2026

    @alexwrite
    OwnerAuthor

    Prise en charge (worktree templates, branche fix/blade-view-resolution, empilée sur la branche Twig de #19 : le mécanisme « appel PHP qui rend un template » est commun aux deux et n'est écrit qu'une fois).

    Périmètre de fichiers visé :

    • graphify/extractors/blade.py
    • graphify/extractors/php_views.py (ajout du moteur Blade : view(), View::make(), response()->view())
    • tests/test_languages.py ou test dédié, fixtures neutres

    Approche : @extends / @include résolus sous resources/views (chemin par défaut de Laravel), lien vers le nœud du fichier réel ; nom dynamique ou espace de noms pkg::vue : aucun lien vers un fichier.

  3. alexwrite commented on Oct 11, 2026

    @alexwrite
    OwnerAuthor

    Fait

    Comment

    • graphify/extractors/blade.py : _views_root, resolve_blade_name, add_view_ref (arête marquée target_file, sans nœud fantôme ; une inclusion répétée donne une seule arête).
    • graphify/extractors/php_views.py : _is_laravel_view_call et moteur blade dans la table des résolveurs, même mécanisme que Twig.
    • graphify/cache.py : schéma du cache AST 9 vers 10.
    • Tests : tests/test_blade_extractor.py (2 tests) et tests/fixtures/laravel_views/.

    Pourquoi ce choix

    • Résolution calquée sur FileViewFinder de Laravel (laravel/framework v12.69.2, FileViewFinder.php:43 pour l'ordre des extensions, :149 pour les points changés en /), sous le chemin par défaut resources/views (config/view.php).
    • Les dossiers ajoutés à l'exécution (thème de ClientXCMS par View::addLocation) ne sont pas devinés : le thème actif n'est pas connu statiquement. Alternative écartée : chercher aussi dans resources/themes/default/views, qui lierait à un thème qui n'est peut-être pas celui en service.
    • Mécanisme PHP partagé avec Twig : prendre en charge les templates et le lien contrôleur vers vue #19 plutôt qu'un second détecteur, d'où l'empilement des deux PR.

    Apprentissages

    • mass-actions/ et mass_actions/ coexistent dans ClientXCMS et donnent le même identifiant : la désambiguïsation les sépare, et le marquage target_file envoie bien chaque @include vers le bon des deux (23 inclusions vérifiées).
    • Un appel view() en commentaire n'est pas relié, ce qu'une recherche par expression régulière aurait compté à tort (60 attendus par regex, 59 réels).

    Faiblesses restantes

    Quality

    • Tests : 7552 passed, 14 skipped (suite complète)
    • Analyse statique : pyright 0 errors sur blade.py et php_views.py
    • 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

    bugSomething isn't workingp2Défaut visible par l'utilisateur

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions