Construye un motor de plantillas casero en PHP II

Publicado en Snippets · 20 August 2019.

En la primera parte de Construye un motor de plantilla PHP casero desde cero ( que recomiendo leer para continuar con la lectura de esta entrada ) vimos cómo crear un motor de plantillas muy sencillo al que llamamos Rastreator. Rastreator podía parsear plantillas o vistas en busca de referencias( o {{variables}} ), reemplazándolas por sus valores asociados.

En esta segunda parte, y gracias a todos los likes que disteis, añadiremos a Rastreator la opción de filtros y de plugins que puedan extenderlo. ¿ Me echas una mano otra vez ?.

Lo primero, antes de entrar en código, es necesario entender dos conceptos muy importantes:

  • Pipelines: Como nos explica la definición de pipeline en Wikipedia, un pipeline es una serie de elementos trabajando uno detrás de otro de manera que la salida de uno es la entrada del siguiente. Es decir, básicamente lo que ocurre en las cadenas de producción de las grandes fabricas: un operario transforma un recurso, el siguiente toma lo que hizo el anterior y añade otra pequeña transformación y así hasta el último.

Sí, si has tocado el terminal Linux, es lo mismo que los pipelines de Linux. Sí, también, si has trabajado con WordPress, es como los filtros de WP. Nosotros usaremos los pipelines de la siguiente forma:

Como vemos, primero habrá que obtener el valor de la variable var_name. Después, habrá que modificar Rastreator para permitir que el valor de esa variable pase a un primer filtro( filtro_1 ), que las modificaciones de este filtro pase a un segundo( filtro_2 ) y así, filtro por filtro, hasta que no quede más filtros. El valor resultante se devolverá. Si algún filtro usado no estuviera registrado, devolveremos el valor que tuviera la variable hasta entonces( aunque esto lo podemos debatir si tu quieres ).

  • Las funciones anónimas. A diferencia de lo que la gente cree, a lo que en PHP suelen llamarse “funciones anónimas” ni son funciones ni son anónimas. Lo más correcto sería llamarlas closures. Decir esto para mi es incómodo, porque cada vez que lo digo me miran como si lo dicho fuera un disparate y a mi como a un ignorante de PHP. Pero creeme que no te engaño, cuando haces algo como:

$func = function() { ...code of function... };

PHP lo que hace es meter tu código del closure en el método mágico __invoke y wrappearlo en un objeto de tipo Closure. Es decir, en el código anterior $func es un objeto, para nada una función. Lo sé, sigues sin creerme, a ver si te convenzo, prueba lo siguiente:

¿ Ves ?. No te diré que te lo dije...aunque... Bueno, nosotros usaremos las closures para hacer que nuestro Parser sea abierto en extensión, pero cerrado en modificación( Uncle Bob estará orgulloso de nosotros, ya verás ). Ahora sí vamos al código.

En esta nueva versión de Rastreator hemos modificado el método return_var_value_from_tokens( línea 43 a 52 ) para que genere el pipeline( simplemente hace un split por '|' de la referencia de variable encontrada ). El primer elemento del pipeline es la variable en sí y su valor el valor de base( el que se pasará al pipeline para que lo filtre ).

El pipeline se desarrolla en el método do_pipeline( línea 78 a 96 ), que lo único que hace es iterar entre los filtros pasándole el valor generado por el filtro anterior.

Un filtro se declara usando el método add_filter( línea 72 a 76 ). Fíjate que un filtro no es más que callback con un nombre asociado( el que figurará en el nombre de la variable después de un | ).

También te habrás dado cuenta que hemos añadido la opción de extender a Rastreator con plugins( add_plugin ). En este caso, forzamos que el callback sea de tipo closure( pues, como sabrás, todas las closures son callbacks pero no todos los callbacks son closures ). Así, mediante bindTo asociamos el closure al objeto actual de Rastreator. Así, permitimos que el closure actúe como si fuera un método nativo de Rastreator( y pueda usar los otros métodos de Rastreator, sí, incluso los privados ).

Los plugins añadidos lo que hacen es reemplazar o expandir( línea 37 ) las expresiones regulares que se hacen sobre la plantilla.

Vamos a ver todo lo dicho en un "pequeño" script:

La primera parte se definen unos filtros, que luego son usados en el resto del script.

También en las líneas 23 a 38 definimos un nuevo plugin que da soporte a if a Rastreator. Luego, se comprueba.

Creo que todo es muy autoexplicativo, así que no añado más comentarios. Si no fuera así, advertirmelo por Twitter o Linkedin y añadiré algunas explicaciones extras.

Para finalizar, gracias por vuestros likes para hacer la continuación. Espero que os haya gustado esta ampliación del motor de plantillas casero.

¡ Feliz verano a todos !

¡ Compártelo !
Este sitio utiliza cookies propias y de terceros para mejorar tu experiencia con el sitio web. Al continuar con la navegación consideramos que acepta su uso.