Como var_dump variáveis ​​em modelos de galho?


156

Visualizar o padrão da camada em que você apenas apresenta o que foi dado é bom e tudo, mas como você sabe o que está disponível? Existe uma funcionalidade "listar todas as variáveis ​​definidas" no TWIG? Existe uma maneira de despejar uma variável?

A solução que eu encontrei procurando por ele era definir uma função onde eu posso usar minhas ferramentas php depuração existentes por injeção de uma função , mas todas as referências que eu encontrei para que inclua estes agradáveis duas linhas de código, mas nada é especificado onde colocá-los. Considerando o fato de que eles precisam de uma variável $ loader definida, tentei /app/config/autoload.php, mas o $ loader era do tipo errado. Onde coloco o código php para adicionar uma função twig?

Respostas:


251

A partir do Twig 1.5, a resposta correta é usar a função de despejo. Está totalmente documentado na documentação do Twig . Aqui está a documentação para habilitar isso dentro do Symfony2.

{{ dump(user) }}

3
BTW, tenha cuidado ao despejar objetos com mapeamento relacional
pleerock

14
Quando eu uso {{ dump() }}para despejar todas as variáveis, ele retorna uma página em branco. Existe alguma outra maneira de despejar uma variável?
Jerry Pham

Estou usando a versão mais recente do Symfony 2.5 e tenho o modo de configuração e depuração config.yml e config_dev.yml ativado ao carregar o kernel para o ambiente de desenvolvimento. Eu tentei os outros métodos manuais mencionados por Morland abaixo. De qualquer maneira, também recebo uma página em branco quando o dump é usado. E sem lixo.
Chadwick Meyer

Se você receber uma página em branco com e sem o dump, obviamente dumpnão é esse o problema. Eu sugeriria postar uma nova pergunta se você não conseguir descobrir o contrário.
Icode4food #

1
Eu recebo o seguinte erro: `Twig_Error_Syntax - "dump" Desconhecido function`
Patros

28

Você pode usar a debugtag, documentada aqui .

{% debug expression.varname %}

Edit: A partir do Twig 1.5, isso foi preterido e substituído pela nova dumpfunção (observe, agora é uma função e não é mais uma tag). Veja também: A resposta aceita acima.


7
Se você receber um erro dizendo Unknown tag name "debug", estenda sua configuração (global config.ymlou config_dev.yml) conforme descrito aqui: github.com/symfony/symfony-docs/issues/455#issuecomment-1884861
flu

5
Este método está obsoleto no Twig 1.5.
Icode4food

4
Adicionada uma nota de descontinuação à resposta.
igorw

17

Então, eu consegui funcionar, em parte um pouco hackish:

  1. Situado twig: debug: 1emapp/config/config.yml
  2. Adicione isso ao 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 minha própria função de depuração em vez de print_r(), abri vendor/twig-extensions/lib/Twig/Extensions/Node/Debug.phpe mudei print_r(parad(

PS. Eu ainda gostaria de saber como / onde pegar o ambiente $ twig para adicionar filtros e extensões.


1
btw: para limpar o cache, você pode usar a ferramenta de console ( stackoverflow.com/questions/6789950/… )
Raffael

existe alguma vantagem em fazer isso?
Alexander Morland

é mais fácil ... se você não sabe a ferramenta console, eu recomendo que você check-out
Raffael

3
Você não deveria ter que definir twig: debug: 1porque está herdando essas informações do ambiente do seu controlador frontal. Caso contrário, você poderá gerar informações de depuração não intencionalmente em seu ambiente de produção. Desde que você esteja trabalhando no ambiente de desenvolvimento, ele é ativado por padrão e desativado em seu ambiente de produção.
flu

1
Isso está desatualizado no Twig 1.5. Veja outra resposta: stackoverflow.com/a/10080404/107768
Icode4food

14

Se você estiver usando o Twig no seu aplicativo como um componente, você pode fazer isso:

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

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

Em seguida, em seus modelos:

{{ my_variable | var_dump }}

Onde colocar / substituir esses $twig = new Twig_Environment($loader, array(...?
PolGraphic

5

Se você estiver usando o Twig como um componente independente, veja alguns exemplos de como habilitar a depuração, pois é improvável que a função dump (variável) funcione diretamente da caixa

Estar sozinho

Isso foi encontrado no link fornecido pelo icode4food

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

Silex

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

5

Despejar todas as variáveis ​​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 %}

Você pode usar o meu plugin, que fará isso por você (e formatará bem a saída):

Twig Dump Bar


bom trecho. obrigado. isso funciona para mim se eu substituir dump (value) por value | var_dump
matthijs koevoets

3

{{ dump() }}não funciona para mim. PHPengasga. Nível de aninhamento muito profundo, eu acho.

Tudo o que você realmente precisa para os debugmodelos Twig, se estiver usando um, debuggeré uma extensão como esta .

Depois, basta definir um ponto de interrupção e ligar para {{ inspect() }}onde você precisar. Você obtém as mesmas informações do {{ dump() }}mas no seu depurador.


3

Desde o Symfony> = 2.6, existe um bom componente VarDumper , mas não é usado pela dump()função Twig .

Para substituí-lo, podemos criar uma extensão:

Na implementação a seguir, não se esqueça de substituir os espaços para nome.

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';
    }

}

Sim, eu estava olhando para este :)
Tim Strijdhorst

2

A receita completa aqui para referência mais rápida (observe que todas as etapas são obrigatórias):

1) ao instanciar o Twig, passe a opção debug

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

2) adicione a extensão de depuração

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

3) Use-o como @Hazarapet Tunanyan apontou

{{ dump(MyVar) }}

ou

{{ dump() }}

ou

{{ dump(MyObject.MyPropertyName) }}

1

Para depurar modelos do Twig, você pode usar a instrução debug .

insira a descrição da imagem aqui

Lá você pode definir explicitamente a configuração de depuração.


I get 'Unknown nome tag "debug"' com e sem ajuste que twig.debug: true
Alexander Morland

se você estiver trabalhando no modo de prod você tem que limpar o cache primeiro
Raffael

@AlexanderMorland Olá Alex, você precisa estender sua configuração conforme descrito aqui: github.com/symfony/symfony-docs/issues/455#issuecomment-1884861 para se livrar do Unknown tag name "debug"erro.
flu

1

Você pode editar

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

e mude as the var_dump()funções para\Doctrine\Common\Util\Debug::dump()


3
Não é recomendável editar nada na pasta do fornecedor.
Luis Milanese

1

Como a maioria dos bons programadores de PHP gosta de usar o XDebug para realmente executar o código em execução e observar as variáveis ​​mudarem em tempo real, o uso dump()parece um retrocesso para os maus velhos tempos.

Foi por isso que criei uma extensão Twig Debug e a coloquei no Github.

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

composer require delboy1978uk/twig-debug

Em seguida, adicione a extensão. Se você não estiver usando o Symfony, faça o seguinte:

<?php

use Del\Twig\DebugExtension;

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

Se estiver, assim em seus serviços, configuração YAML:

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

Depois de registrado, agora você pode fazer isso em qualquer lugar em um modelo de galho:

{{ breakpoint() }}

Agora, você pode usar o XDebug, a execução será pausada e você poderá ver todas as propriedades do Contexto e do Ambiente.

Diverta-se! :-D


0

você pode usar a função dump e imprimi-la assim

{{ dump(MyVar) }}

mas há uma coisa interessante também, se você não definir nenhum argumento para despejar a função, ele imprimirá todas as variáveis ​​disponíveis , como

{{ dump() }}

Sim, funciona, mas você precisa garantir que a depuração esteja ativada nas opções ao instanciar o Twig
Tudor Ilisoi

0

Se você estiver em um ambiente em que não poderá usar a dumpfunção (ex: opencart), poderá tentar:

{{ my_variable | json_encode(constant('JSON_PRETTY_PRINT')) }}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.