Tests y debugging en Twig

Los tests en Twig permiten comprobar variables del entorno. Con debugging podemos mostrar el valor de las mismas

Contenido modificable

Si ves errores o quieres modificar/añadir contenidos, puedes crear un pull request. Gracias

Los tests en Twig permiten comprobar variables frente a expresiones, como por ejemplo para comprobar su existencia o que equivale a valor determinado.

constant

constant comprueba si una variable tiene el mismo valor que una constante. Puedes comprobar constantes globales o de clases:

{% if post.status is constant('Post::PUBLISHED') %}
    the status attribute is exactly the same as Post::PUBLISHED
{% endif %}

O también de instancias de objetos:

{% if post.status is constant('PUBLISHED', post) %}
    the status attribute is exactly the same as Post::PUBLISHED
{% endif %}

defined

defined comprueba si una variable está definida en el contexto actual. Es muy útil si empleas la opción _strictvariables:

{# defined works with variable names #}
{% if foo is defined %}
    ...
{% endif %}

{# and attributes on variables names #}
{% if foo.bar is defined %}
    ...
{% endif %}

{% if foo['bar'] is defined %}
    ...
{% endif %}

Cuando se emplea el test defined en una expresión que utiliza variables en algunas llamadas a métodos, asegúrate primero de que están definidas esas variables primero:

{% if var is defined and foo.method(var) is defined %}
    ...
{% endif %}

divisible by

divisible by comprueba si una variable es divisible por un número:

{% if loop.index is divisible by(3) %}
    ...
{% endif %}

empty

empty comprueba si una variable está vacía:

{# devuelve true si la variable foo es null, false, una array vacío, o un string vacío #}
{% if foo is empty %}
    ...
{% endif %}

even

even devuelve true si el número dado es impar:

{{ var is even }}

iterable

iterable comprueba si una variable es un array o un objeto traversable:

{# devuelve true si la variable foo es iterable #}
{% if users is iterable %}
    {% for user in users %}
        Hello {{ user }}!
    {% endfor %}
{% else %}
    {# users es probablemente un string #}
    Hello {{ users }}!
{% endif %}

null

null devuelve true si la variable es null. none es un alias de null.

{{ var is null }}

odd

odd devuelve true si el número dado es par:

{{ var is odd }}

same as

same as comprueba si una variable es la misma que otra variable. Es el equivalente a === en PHP:

{% if foo.attribute is same as(false) %}
    El atributo foo equivale al 'false' de PHP
{% endif %}

Debugging

En PHP podemos emplear la función dump del componente VarDumper si necesitas comprobar el valor de una variable. Esto puede emplearse por ejemplo en un controller:

// src/AppBundle/Controller/ArticleController.php
namespace AppBundle\Controller;

// ...

class ArticleController extends Controller
{
    public function recentListAction()
    {
        $articles = ...;
        dump($articles);

        // ...
    }
}

La salida de la función dump es entonces renderizada en la barra web del desarrollador.

El mismo mecanismo puede emplearse en las templates Twig con la función dump:

{# app/Resources/views/article/recent_list.html.twig #}
{{ dump(articles) }}

{% for article in articles %}
    <a href="/article/{{ article.slug }}">
        {{ article.title }}
    </a>
{% endfor %}

Las variables sólo se mostrarán si el ajuste de Twig debug (en config.yml) es true. Por defecto esto significa que las variables se volcarán en el entorno dev pero no en el prod.

Comprobación de sintaxis

Puedes comprobar errores de sintaxis en templates Twig con el comando de consola lint:twig:

# Puedes comprobar por nombre de archivo:
$ php bin/console lint:twig app/Resources/views/article/recent_list.html.twig

# o por directorio:
$ php bin/console lint:twig app/Resources/views