Dieselbe Änderung in allen Blade-Dateien einer Laravel-App durchzuziehen ist schwieriger, als es aussieht. Ein sed-Einzeiler ersetzt jeden Treffer, auch die in Strings, Kommentaren und fremden Attributen. Forte von John Koster parst .blade.php-Dateien in einen typisierten Syntaxbaum, erlaubt Abfragen auf diesem Baum und rendert das umgeschriebene Template wieder zurück. Koster ist auch der Autor von prettier-plugin-blade, dessen Version 3 auf Forte läuft.
composer require fortephp/forteForte braucht PHP 8.2, die dom-Extension und Laravel 10 bis 13. Installiert wird mit composer require fortephp/forte, der Service Provider registriert sich selbst. Forte::parse() nimmt einen String, Forte::parseFile() einen Pfad; beide liefern ein Document. Ein nicht geschlossenes Tag oder ein @if ohne @endif erzeugt eine Diagnose plus einen partiellen Baum, der sich weiterhin abfragen und umschreiben lässt. Ein unverändertes Document wird byteidentisch gerendert, inklusive Whitespace.
Die Abfragemethoden liefern Lazy Collections: queryElements('form'), queryBlockDirectives(['if', 'unless']) und queryComponents(['x-alert', 'livewire:*']) sind die wichtigsten Einstiege, dazu Direktzugriffe wie elementById() und hasElement(). Attribute kennen isDynamic() für gebundene Werte und attributeTokens('class') zum Aufsplitten von Klassenlisten. Forte baut aus dem Baum außerdem ein DOMDocument und führt Ausdrücke über PHPs DOMXPath aus. Blade-Konstrukte landen in einem forte-Namespace, @if-Blöcke werden zu forte:if, Echos zu forte:echo. Treffer kommen als Forte-Nodes zurück und lassen sich direkt an ein Rewrite übergeben.
apply(), rewrite() und rewriteWith() geben jeweils ein neues Document zurück und lassen das Original unangetastet. rewriteWith() nimmt eine Closure, die einen NodePath statt des Knotens erhält. NodePath bietet Zugriff auf Eltern, Geschwister, Vorfahren und Tiefe sowie Methoden wie getAttribute(), setAttribute(), removeAttribute(), addClass(), renameTag(), replaceWith(), remove(), insertBefore() und insertAfter(). skipChildren() und stopTraversal() beenden den Durchlauf vorzeitig. Änderungen werden gesammelt und in einem Durchgang angewendet. Längere Transformationen schreibt man als Visitor mit enter()- und leave()-Hooks; ein RewriteBuilder deckt die deklarative Variante ab: Knoten per XPath wählen, Mutationen einreihen. Eine Builder-Klasse erzeugt neue Element-, Direktiven- und Echo-Knoten.
Der Artikel zeigt drei Praxisfälle. Audit: Alle Dateien unter resources/views parsen und queryComponents(['x-alert']) zählen, um echte Komponenten-Nutzungen zu finden. grep würde auch Kommentare, Strings und Klassennamen wie x-alert-icon mitzählen. Codemod: Ein rewriteWith()-Durchlauf ergänzt loading="lazy" bei jedem <img> ohne das Attribut, über Hunderte Views hinweg; bei Fehlern rollt git restore zurück. CI-Check: Ein Pest-Test lässt den Build fehlschlagen, wenn ein POST-Formular kein @csrf enthält, ausgedrückt als XPath //form[@method="POST"][not(.//forte:csrf)]. Ein zweiter Ausdruck meldet @foreach-Blöcke, deren erstes Kind kein wire:key-Attribut hat.
Der Autor benennt auch die Grenzen: Für eine einmalige Umbenennung in dreißig Views sind sed oder die strukturelle Suche der IDE schneller. Forte lohnt sich, wenn die Regel strukturabhängig ist, wenn der Diff zu groß für manuelle Kontrolle wird oder wenn ein Check bei jedem Commit läuft.
Zwei weitere Pakete bauen auf Forte. Chisel ist prettier-plugin-blade v3, neu geschrieben gegen den Parser, und soll komplexe reale Templates 140-mal schneller formatieren als die Vorgängerversion; Voraussetzung ist Node 18 oder neuer. Reload ist ein experimentelles Vite-Plugin, das Blade-Änderungen ohne vollständigen Reload ins DOM patcht und nach einer einstellbaren Zahl inkrementeller Patches auf einen vollen Reload zurückfällt. Forte steht unter MIT-Lizenz, aktuell bei v1.1.0. Der Quellcode liegt auf GitHub, Doku und interaktiver Playground auf fortephp.com.




Kommentare
Noch keine Kommentare — schreib den ersten.
Starte die Diskussion
Kein Konto, kein Passwort nötig — gib einfach deine E-Mail-Adresse ein, wir senden dir einen einmaligen Anmelde-Link. Beim ersten Mal bist du damit automatisch angemeldet.
Deine Bewertung wird nach der Anmeldung automatisch übernommen.
Schau in dein Postfach
Wir haben einen Anmelde-Link an … gesendet. Öffne ihn auf diesem Gerät — dieser Tab meldet dich automatisch an.
Nichts angekommen? Wirf einen Blick in den Spam-Ordner — und markiere die Mail dort als „Kein Spam“, dann landet sie künftig direkt im Postfach.