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?

Alexander Morland
fonte

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) }}
Icode4food
fonte
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.

igorw
fonte
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.

Alexander Morland
fonte
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 }}
Julio
fonte
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'
));
Carlton
fonte
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

kapitalny
fonte
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.

Christian Fecteau
fonte
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';
    }

}
Alain Tiemblo
fonte
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) }}
Tudor Ilisoi
fonte
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.

Raffael
fonte
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()

user3420644
fonte
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

delboy1978uk
fonte
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() }}
Hazarapet Tunanyan
fonte
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')) }}
redochka
fonte