Motor de Plantillas PHP

UIEngine

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

¿Qué es UIEngine?

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.

Seis razones para elegir UIEngine

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.

Auto-escape

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.

Herencia e includes

{extends}, {block}, {parent} e {include} para layouts reutilizables, más {function} para tus propias macros de plantilla.

Sandbox de política de seguridad

Restricción opcional: modificadores permitidos, constantes PHP visibles, directorios de plantillas adicionales, desactivar {eval}, permitir {fetch} solo con autorización explícita.

Caché de salida

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

Sin dependencias

PHP 8.1+ puro, con su propio autoloader PSR-4 para usarlo sin Composer, aunque funciona igual de bien con él.

Así se ve en la práctica

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 seguridad no es una idea de último momento

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.

¿Listo para empezar?

En pocos minutos tendrás tu primera página funcionando – el inicio rápido explica cada paso.