¿Cómo var_dump variables en plantillas de ramita?

156

Ver el patrón de capa donde solo presenta lo que le han dado está bien y todo, pero ¿cómo sabe lo que está disponible? ¿Existe una funcionalidad de "enumerar todas las variables definidas" en TWIG? ¿Hay alguna manera de volcar una variable?

La solución que encontré al buscarla fue definir una función en la que pueda usar mis herramientas de depuración php existentes mediante la inyección de una función , pero todas las referencias que he encontrado incluyen estas dos bonitas líneas de código, pero en ningún lugar se especifica dónde colocarlos Por el hecho de que necesitan una variable $ loader definida, probé /app/config/autoload.php pero el $ loader allí era del tipo incorrecto. ¿Dónde coloco el código php para agregar una función de ramita?

Alexander Morland
fuente

Respuestas:

251

A partir de Twig 1.5, la respuesta correcta es usar la función de volcado. Está completamente documentado en la documentación de Twig . Aquí está la documentación para habilitar esto dentro de Symfony2.

{{ dump(user) }}
Icode4food
fuente
3
Por cierto, tenga cuidado al volcar objetos con mapeo relacional
pleerock
14
Cuando uso {{ dump() }}para volcar todas las variables, devuelve una página en blanco. ¿Hay alguna otra forma de volcar una variable?
Jerry Pham
Estoy usando la última versión de Symfony 2.5, y tengo el modo de configuración y depuración config.yml y config_dev.yml activado al cargar el kernel para el entorno de desarrollo. He probado los otros métodos manuales mencionados por Morland a continuación. De cualquier manera, también obtengo una página en blanco cuando se usa el volcado. Y no hay basurero.
Chadwick Meyer
Si obtiene una página en blanco con y sin dump, obviamente dumpno es el problema. Sugeriría publicar una nueva pregunta si no puede resolverlo de otra manera.
Icode4food
1
Me sale el siguiente error: `Twig_Error_Syntax - Función de" volcado "desconocida`
Pathros
28

Puede usar la debugetiqueta, que se documenta aquí .

{% debug expression.varname %}

Editar: a partir de Twig 1.5, esto ha quedado en desuso y reemplazado con la nueva dumpfunción (nota, ahora es una función y ya no es una etiqueta). Ver también: La respuesta aceptada arriba.

igorw
fuente
77
Si recibe un mensaje de error Unknown tag name "debug", extienda su configuración (ya sea global config.ymlo config_dev.yml) como se describe aquí: github.com/symfony/symfony-docs/issues/455#issuecomment-1884861
gripe
55
Este método está en desuso desde Twig 1.5.
Icode4food
44
Se agregó una nota de desaprobación a la respuesta.
igorw
17

Así que lo hice funcionar, en parte un poco hack:

  1. Establecer twig: debug: 1enapp/config/config.yml
  2. Agregue esto a config_dev.yml

    services:
        debug.twig.extension:
            class: Twig_Extensions_Extension_Debug
            tags: [{ name: 'twig.extension' }]
    
  3. sudo rm -fr app/cache/dev

  4. Para usar mi propia función de depuración en lugar de print_r(), abrí vendor/twig-extensions/lib/Twig/Extensions/Node/Debug.phpy cambié print_r(ad(

PD. Todavía me gustaría saber cómo / dónde tomar el entorno $ twig para agregar filtros y extensiones.

Alexander Morland
fuente
1
por cierto: para borrar el caché puede usar la herramienta de consola ( stackoverflow.com/questions/6789950/… )
Raffael
¿Hay alguna ventaja para hacer eso?
Alexander Morland
es más sencillo ... si no conoces la herramienta de consola, te recomiendo que la revises
Raffael
3
No debería tener que configurarlo twig: debug: 1porque está heredando esta información del entorno de su controlador frontal. De lo contrario, podría terminar generando información de depuración de forma no intencional en su entorno de producción. Mientras trabaje en el entorno de desarrollo, estará habilitado de forma predeterminada y estará deshabilitado en su entorno de producción.
gripe el
1
Esto está desactualizado a partir de Twig 1.5. Ver otra respuesta: stackoverflow.com/a/10080404/107768
Icode4food
14

Si está utilizando Twig en su aplicación como componente , puede hacer esto:

$twig = new Twig_Environment($loader, array(
    'autoescape' => false
));

$twig->addFilter('var_dump', new Twig_Filter_Function('var_dump'));

Luego en tus plantillas:

{{ my_variable | var_dump }}
Julio
fuente
¿Dónde colocar / reemplazar esos $twig = new Twig_Environment($loader, array(...?
PolGraphic
5

Si está utilizando Twig como un componente independiente, aquí hay un ejemplo de cómo habilitar la depuración, ya que es poco probable que la función de volcado (variable) funcione de inmediato.

Ser único

Esto se encontró en el enlace proporcionado por icode4food

$twig = new Twig_Environment($loader, array(
    'debug' => true,
    // ...
));
$twig->addExtension(new Twig_Extension_Debug());

Sílex

$app->register(new \Silex\Provider\TwigServiceProvider(), array(
    'debug' => true,
    'twig.path' => __DIR__.'/views'
));
Carlton
fuente
5

Volcar todas las variables personalizadas:

<h1>Variables passed to the view:</h1>
{% for key, value in _context %}
    {% if key starts with '_' %}
    {% else %}
        <pre style="background: #eee">{{ key }}</pre>
        {{ dump(value) }}
    {% endif %}
{% endfor %}

Puede usar mi complemento que lo hará por usted (y formateará muy bien la salida):

Barra de descarga de ramita

kapitalny
fuente
Bonito fragmento. gracias. esto funciona para mí si reemplazo dump (value) con value | var_dump
matthijs koevoets
3

{{ dump() }}no funciona para mi PHPchokes Nivel de anidación demasiado profundo, supongo.

Todo lo que realmente necesita debugla ramita plantillas si usted está utilizando una debuggeres una extensión como esta .

Entonces es solo cuestión de establecer un punto de interrupción y llamar a {{ inspect() }}donde lo necesite. Obtiene la misma información que con {{ dump() }}pero en su depurador.

Christian Fecteau
fuente
3

Desde Symfony> = 2.6, hay un buen componente VarDumper , pero no es utilizado por la dump()función Twig .

Para sobrescribirlo, podemos crear una extensión:

En la siguiente implementación, no olvide reemplazar los espacios de nombres.

Fuz/AppBundle/Resources/config/services.yml

parameters:
   # ...
   app.twig.debug_extension.class: Fuz\AppBundle\Twig\Extension\DebugExtension

services:
   # ...
   app.twig.debug_extension:
       class: %app.twig.debug_extension.class%
       arguments: []
       tags:
           - { name: twig.extension }

Fuz/AppBundle/Twig/Extension/DebugExtension.php

<?php

namespace Fuz\AppBundle\Twig\Extension;

class DebugExtension extends \Twig_Extension
{

    public function getFunctions()
    {
        return array (
              new \Twig_SimpleFunction('dump', array('Symfony\Component\VarDumper\VarDumper', 'dump')),
        );
    }

    public function getName()
    {
        return 'FuzAppBundle:Debug';
    }

}
Alain Tiemblo
fuente
Sí, estaba buscando esto :)
Tim Strijdhorst
2

La receta completa aquí para una referencia más rápida (tenga en cuenta que todos los pasos son obligatorios):

1) al instanciar Twig, pasa la opción de depuración

$twig = new Twig_Environment(
$loader, ['debug'=>true, 'cache'=>false, /*other options */]
);

2) agregue la extensión de depuración

$twig->addExtension(new \Twig_Extension_Debug());

3) Úselo como señaló @Hazarapet Tunanyan

{{ dump(MyVar) }}

o

{{ dump() }}

o

{{ dump(MyObject.MyPropertyName) }}
Tudor Ilisoi
fuente
1

Para depurar plantillas de Twig puede usar la instrucción de depuración .

ingrese la descripción de la imagen aquí

Allí puede establecer la configuración de depuración explícitamente.

Raffael
fuente
Obtengo 'Nombre de etiqueta desconocido "debug" con y sin configurar esa twig.debug: true
Alexander Morland
si está trabajando en modo prod, primero debe borrar el caché
Raffael, el
@AlexanderMorland Hola Alex, tienes que extender tu configuración como se describe aquí: github.com/symfony/symfony-docs/issues/455#issuecomment-1884861 para deshacerte del Unknown tag name "debug"error.
gripe
1

Puedes editar

/vendor/twig/twig/lib/Twig/Extension/Debug.php

y cambiar the var_dump()funciones a\Doctrine\Common\Util\Debug::dump()

usuario3420644
fuente
3
No se recomienda editar nada en la carpeta del proveedor.
Luis Milanese
1

Como a la mayoría de los buenos programadores de PHP les gusta usar XDebug para realmente recorrer el código en ejecución y ver cómo cambian las variables en tiempo real, el uso se dump()siente como un paso atrás a los viejos tiempos.

Es por eso que hice una extensión Twig Debug y la puse en Github.

https://github.com/delboy1978uk/twig-debug

composer require delboy1978uk/twig-debug

Luego agrega la extensión. Si no estás usando Symfony, así:

<?php

use Del\Twig\DebugExtension;

/** @var $twig Twig_Environment */
$twig->addExtension(new DebugExtension());

Si es así, así en la configuración de YAML de sus servicios:

twig_debugger:
    class: Del\Twig\DebugExtension
    tags:
        - { name: twig.extension }

Una vez registrado, ahora puede hacer esto en cualquier lugar en una plantilla de ramita:

{{ breakpoint() }}

Ahora, puede usar XDebug, la ejecución se detendrá y podrá ver todas las propiedades del Contexto y el Entorno.

¡Que te diviertas! :-RE

delboy1978uk
fuente
0

puedes usar la función de volcado e imprimirlo así

{{ dump(MyVar) }}

pero también hay una cosa buena, si no configura ningún argumento para volcar la función, imprimirá todas las variables disponibles , como

{{ dump() }}
Hazarapet Tunanyan
fuente
Sí, funciona, pero debe asegurarse de que la depuración esté habilitada en las opciones al instanciar Twig
Tudor Ilisoi
0

Si se encuentra en un entorno donde no puede usar la dumpfunción (por ejemplo, opencart), puede intentar:

{{ my_variable | json_encode(constant('JSON_PRETTY_PRINT')) }}
redochka
fuente