Aplicar el mismo cambio en todos los archivos Blade de una aplicación Laravel es más difícil de lo que parece. Un sed de una línea reemplaza cada coincidencia, incluidas las que están dentro de cadenas, comentarios y atributos ajenos. Forte, escrito por John Koster, analiza los archivos .blade.php y genera un árbol de sintaxis tipado que se puede consultar y reescribir. Koster también es autor de prettier-plugin-blade, cuya versión 3 funciona sobre Forte.
composer require fortephp/forteForte requiere PHP 8.2, la extensión dom y Laravel 10 a 13. Se instala con composer require fortephp/forte y el service provider se registra solo. Forte::parse() acepta una cadena y Forte::parseFile() una ruta; ambos devuelven un Document. Una etiqueta sin cerrar o un @if sin @endif genera un diagnóstico y un árbol parcial que sigue pudiendo consultarse y reescribirse. Un documento sin cambios se renderiza byte a byte igual, incluidos los espacios.
Los métodos de consulta devuelven colecciones lazy: queryElements('form'), queryBlockDirectives(['if', 'unless']) y queryComponents(['x-alert', 'livewire:*']) son las entradas principales, junto a accesos directos como elementById() y hasElement(). Los atributos ofrecen isDynamic() para valores enlazados y attributeTokens('class') para dividir listas de clases. Forte también construye un DOMDocument a partir del árbol y ejecuta expresiones con DOMXPath de PHP. Las construcciones Blade van a un espacio de nombres forte: los bloques @if se convierten en forte:if y los ecos en forte:echo. Los resultados llegan como nodos Forte y pueden pasarse directamente a una reescritura.
apply(), rewrite() y rewriteWith() devuelven un nuevo Document y dejan intacto el original. rewriteWith() recibe una closure que obtiene un NodePath en lugar del nodo. NodePath expone padres, hermanos, ancestros y profundidad, además de métodos como getAttribute(), setAttribute(), removeAttribute(), addClass(), renameTag(), replaceWith(), remove(), insertBefore() e insertAfter(). skipChildren() y stopTraversal() cortan el recorrido. Las ediciones se encolan y se aplican en una sola pasada. Las transformaciones más largas se escriben como Visitor con los hooks enter() y leave(); un RewriteBuilder cubre la versión declarativa: seleccionar nodos por XPath y encolar mutaciones. Una clase Builder crea nodos nuevos de elemento, directiva y eco.
El artículo desarrolla tres casos prácticos. Auditoría: analizar todos los archivos de resources/views y contar queryComponents(['x-alert']) para hallar usos reales del componente, donde grep también contaría comentarios, cadenas y clases como x-alert-icon. Codemod: una pasada con rewriteWith() añade loading="lazy" a cada <img> sin el atributo en cientos de vistas, con git restore como vuelta atrás. Control de CI: un test de Pest hace fallar el build si un formulario POST carece de @csrf, expresado como una consulta XPath, //form[@method="POST"][not(.//forte:csrf)]. Una segunda expresión señala los bloques @foreach cuyo primer hijo no tiene atributo wire:key.
El autor también marca los límites: para un renombrado único en treinta vistas, sed o la búsqueda estructural del IDE son más rápidos. Forte compensa cuando la regla depende de la estructura, cuando el diff es demasiado grande para revisarlo a mano o cuando la comprobación corre en cada commit.
Otros dos paquetes se apoyan en Forte. Chisel es prettier-plugin-blade v3 reescrito sobre el nuevo analizador, y se afirma que formatea plantillas reales complejas 140 veces más rápido que la versión anterior; necesita Node 18 o superior. Reload es un plugin experimental de Vite que aplica los cambios de Blade en el DOM sin recarga completa, con retorno a una recarga total tras un número configurable de parches incrementales. Forte tiene licencia MIT y va por la v1.1.0. El código está en GitHub y la documentación con un playground interactivo en fortephp.com.




Comentarios
Aún no hay comentarios — escribe el primero.
Inicia la conversación
Sin cuenta ni contraseña — introduce tu correo y te enviamos un enlace de acceso de un solo uso. ¿Primera vez? Todo se configura automáticamente.
Tu valoración se aplicará automáticamente al iniciar sesión.
Revisa tu bandeja de entrada
Hemos enviado un enlace de acceso a …. Ábrelo en este dispositivo — esta pestaña te conectará automáticamente.
¿No llega nada? Mira en la carpeta de spam — y marca el correo como «No es spam» para que la próxima vez llegue directo.