Sin eval()
Cada expresión pasa por un analizador de gramática recursivo en lugar de generación de código con preg_replace. Las llamadas a funciones, "::" y las llamadas a métodos quedan categóricamente excluidas.
Motor de Plantillas PHP
Un motor de plantillas PHP ligero que separa claramente la lógica de la presentación – sin eval(), con auto-escape estricto por defecto y una sandbox de seguridad opcional para entornos con varios autores de plantillas.
v15 · auditado externamente · PHP 8.1+ · sin dependencias
UIEngine compila su propia sintaxis de plantillas compacta (archivos .tpl) a PHP en caché. A diferencia de una versión anterior, el compilador actual ya no recurre a la sustitución de texto en bruto: cada expresión pasa por un analizador de gramática recursivo que solo permite un conjunto fijo y verificado de construcciones – variables, operadores de comparación, acceso a arrays/objetos, pero ninguna llamada a función o método ni ::.
El resultado: los autores de plantillas obtienen una sintaxis familiar, al estilo de Smarty, con herencia, includes, modificadores y plugins propios – los desarrolladores mantienen el control total sobre lo que una plantilla puede ejecutar.
Cada expresión pasa por un analizador de gramática recursivo en lugar de generación de código con preg_replace. Las llamadas a funciones, "::" y las llamadas a métodos quedan categóricamente excluidas.
La salida de {$var} se escapa como HTML por defecto. Quien quiera salida sin escapar debe pedirlo explícitamente con |raw – nunca al revés.
{extends}, {block}, {parent} e {include} para layouts reutilizables, más {function} para tus propias macros de plantilla.
Restricción opcional: modificadores permitidos, constantes PHP visibles, directorios de plantillas adicionales, desactivar {eval}, permitir {fetch} solo con autorización explícita.
Las plantillas compiladas se cachean, páginas enteras opcionalmente vía display($tpl,$id,$lifetime) – las islas dinámicas se mantienen en vivo con {nocache}.
PHP 8.1+ puro, con su propio autoloader PSR-4 para usarlo sin Composer, aunque funciona igual de bien con él.
Un fragmento de una página típica con herencia, una condición y un bucle:
{extends 'layout.tpl'}
{block content}
{if $user}
Hallo {$user->name}!
{else}
Hallo Gast!
{/if}
<ul>
{foreach $items as $item}
<li>{$item.name} – {$item.price|number_format:2}€</li>
{/foreach}
</ul>
{/block}
La gramática de expresiones es la medida de seguridad central del motor, no un filtro añadido después. Las rutas para {include} y los archivos de configuración se resuelven con realpath() y se verifican contra el directorio permitido antes de leer cualquier archivo. En v15 el motor fue además auditado externamente – todos los hallazgos están corregidos, consulta las notas de la versión.
En pocos minutos tendrás tu primera página funcionando – el inicio rápido explica cada paso.