Novedades de Twig 3.15

Twig
Solucionex
24
Feb 25

La versión 3.15 de Twig, lanzada recientemente, introduce una serie de mejoras y nuevas funcionalidades que optimizan la experiencia de desarrollo de plantillas en PHP. A continuación, se detallan las principales novedades:

Comentarios en línea

Twig ahora permite añadir comentarios directamente dentro de expresiones y bloques utilizando la sintaxis # .... Esto facilita la documentación del código en ubicaciones donde antes no era posible insertar comentarios. Por ejemplo:

{{
   # Este es un comentario dentro de una expresión
   "Hola Mundo"|upper
}}

Función enum()

Con el creciente uso de enumeraciones en PHP, Twig incorpora la función enum() para manejar enums directamente en las plantillas. Esto permite acceder a casos específicos, métodos y recorrer todas las opciones de una enumeración. Por ejemplo:

{# Mostrar un caso específico de un enum respaldado #}
{{ enum('App\\Config\\SomeOption').SomeCase.value }}
{# Llamar a un método de la clase enum #}
{% enum('App\\Config\\SomeOption').someMethod() %}
{# Obtener todos los casos de un enum #}
{% for case in enum('App\\Config\\SomeOption').cases() %}
   {# ... #}
{% endfor %}

Operador lógico xor

Se añade soporte para el operador lógico xor, que evalúa como true cuando exactamente uno de sus operandos es true, pero no ambos. Esto amplía las capacidades lógicas en las plantillas de Twig. Por ejemplo:

{% if coupon.isValid xor user.hasLoyaltyDiscount %}
   <p>¡Eres elegible para un descuento!</p>
{% else %}
   <p>No se aplica ningún descuento, o no puedes combinar un cupón con tu descuento de fidelidad.</p>
{% endif %}

Mejoras en la precedencia de operadores

Para alinear el comportamiento de Twig con el de PHP, se han realizado ajustes en la precedencia de ciertos operadores. Se recomienda el uso de paréntesis para evitar ambigüedades y prepararse para los cambios previstos en Twig 4. Por ejemplo:

{# Uso recomendado de paréntesis #}
{{ (foo ?? bar) ~ baz }}

Estrategia automática de escape para archivos JSON

Twig ahora aplica automáticamente la estrategia de escape json en archivos con la extensión .json.twig. Esto asegura que las salidas sean seguras y compatibles con aplicaciones que consumen JSON.

{# plantilla.json.twig #}
{
   "usuario": "{{ user.name }}"
}

Deprecación de la etiqueta sandbox

La etiqueta sandbox ha sido marcada como obsoleta. En su lugar, se recomienda manejar el control de acceso directamente en la configuración del entorno o el código del servidor.

{# La etiqueta sandbox ya no es recomendada #}
{% sandbox %}
   {{ contenido }}
{% endsandbox %}

Mejor deprecación de funciones Twig

Twig mejora los mensajes y advertencias al usar funciones obsoletas o no recomendadas, facilitando la migración de código y el mantenimiento de plantillas.

Verificación de funciones Twig en tiempo de compilación

Twig realiza una validación más estricta de las funciones durante la compilación de plantillas, identificando errores antes de ejecutarlas.


Mejoras en el operador punto

El operador punto (.) se ha mejorado para permitir el acceso a propiedades dinámicas y constantes de clase directamente desde un objeto. Esto simplifica la sintaxis y elimina la necesidad de utilizar la función attribute(). Por ejemplo:

{% for property in ['fullName', 'email', 'phoneNumber'] %}
   {{ user.(property) }} <br>
{% endfor %}
{# Acceder a una constante de clase desde un objeto #}
{{ order.SHIPPING_TYPE_EXPEDITED }}


Argumentos nombrados en macros

Twig ahora soporta el uso de argumentos nombrados al invocar macros, lo que mejora la claridad y flexibilidad en las llamadas. Por ejemplo:

{{ forms.field(type: 'text', name: 'user[name]') }}

Compatibilidad con nombres de argumentos en PHP

Se ha mejorado la compatibilidad con nombres de argumentos en funciones PHP, permitiendo el uso de snake_case o camelCase, independientemente de la firma original en PHP. Por ejemplo:

{# Ambas sintaxis son válidas #}
{{ order.summary(include_total: true) }}
{{ order.summary(includeTotal: true) }}

Desempaquetado de argumentos (Argument Unpacking)

Twig soporta ahora el desempaquetado de argumentos, simplificando el paso de listas o arrays como argumentos a macros y funciones.

{% set data = ['type', 'value'] %}
{{ forms.field(...data) }}

Funciones de flecha en todas las funciones de Twig

Twig permite usar funciones de flecha (arrow functions) en cualquier llamada a funciones dentro de las plantillas, lo que permite una sintaxis más limpia y compacta.

{% set items = [1, 2, 3] %}
{{ items|filter(x => x > 1) }}

Twig Playground

Además, como colofón a estas actualizaciones, se ha anunciado Twig Playground, una nueva herramienta que nos permitirá probar y experimentar con plantillas Twig en un entorno sandbox. 

Para más detalles, puedes consultar los anuncios oficiales: