Reputation: 6434
View layer pattern where you only present what you have been given is fine and all, but how do you know what is available? Is there a "list all defined variables" functionality in TWIG? Is there a way to dump a variable?
The solution I found by searching for it was to define a function where I can use my existing php debug tools by injecting a function, but all references I have found to that includes these nice two lines of code, but nowhere is it specified where to place them. Going by the fact that they need a $loader variable defined, I tried /app/config/autoload.php but the $loader there was the wrong kind. Where do I place the php code for adding a twig function?
Upvotes: 179
Views: 267345
Reputation: 8694
As of Twig 1.5, the correct answer is to use the dump function. It is fully documented in the Twig documentation. Here is the documentation to enable this inside Symfony.
{{ dump(user) }}
Upvotes: 290
Reputation: 12829
If you are in an environment where you can't use the dump
function (ex: opencart), you can try:
{{ my_variable | json_encode(constant('JSON_PRETTY_PRINT')) }}
Upvotes: 55
Reputation: 12365
As most good PHP programmers like to use XDebug to actually step through running code and watch variables change in real-time, using dump()
feels like a step back to the bad old days.
That's why I made a Twig Debug extension and put it on Github.
https://github.com/delboy1978uk/twig-debug
composer require delboy1978uk/twig-debug
Then add the extension. If you aren't using Symfony, like this:
<?php
use Del\Twig\DebugExtension;
/** @var $twig Twig_Environment */
$twig->addExtension(new DebugExtension());
If you are, like this in your services YAML config:
twig_debugger:
class: Del\Twig\DebugExtension
tags:
- { name: twig.extension }
Once registered, you can now do this anywhere in a twig template:
{{ breakpoint() }}
Now, you can use XDebug, execution will pause, and you can see all the properties of both the Context and the Environment.
Have fun! :-D
Upvotes: 1
Reputation: 21
You can edit
/vendor/twig/twig/lib/Twig/Extension/Debug.php
and change the var_dump()
functions to \Doctrine\Common\Util\Debug::dump()
Upvotes: 1
Reputation: 2944
The complete recipe here for quicker reference (note that all the steps are mandatory):
1) when instantiating Twig, pass the debug option
$twig = new Twig_Environment(
$loader, ['debug'=>true, 'cache'=>false, /*other options */]
);
2) add the debug extension
$twig->addExtension(new \Twig_Extension_Debug());
3) Use it like @Hazarapet Tunanyan pointed out
{{ dump(MyVar) }}
or
{{ dump() }}
or
{{ dump(MyObject.MyPropertyName) }}
Upvotes: 5
Reputation: 2865
you can use dump function and print it like this
{{ dump(MyVar) }}
but there is one nice thing too, if you don't set any argument to dump function, it will print all variables are available, like
{{ dump() }}
Upvotes: 0
Reputation: 320
Dump all custom variables:
<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 %}
You can use my plugin which will do that for you (an will nicely format the output):
Upvotes: 7
Reputation: 36954
Since Symfony >= 2.6, there is a nice VarDumper component, but it is not used by Twig's dump()
function.
To overwrite it, we can create an extension:
In the following implementation, do not forget to replace namespaces.
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';
}
}
Upvotes: 4
Reputation: 5721
If you are using Twig as a standalone component here's some example of how to enable debugging as it's unlikely the dump(variable) function will work straight out of the box
This was found on the link provided by icode4food
$twig = new Twig_Environment($loader, array(
'debug' => true,
// ...
));
$twig->addExtension(new Twig_Extension_Debug());
$app->register(new \Silex\Provider\TwigServiceProvider(), array(
'debug' => true,
'twig.path' => __DIR__.'/views'
));
Upvotes: 5
Reputation: 1943
If you are using Twig in your application as a component you can do this:
$twig = new Twig_Environment($loader, array(
'autoescape' => false
));
$twig->addFilter('var_dump', new Twig_Filter_Function('var_dump'));
Then in your templates:
{{ my_variable | var_dump }}
Upvotes: 15
Reputation: 99
{{ dump() }}
doesn't work for me. PHP
chokes. Nesting level too deep I guess.
All you really need to debug
Twig templates if you're using a debugger
is an extension like this.
Then it's just a matter of setting a breakpoint and calling {{ inspect() }}
wherever you need it. You get the same info as with {{ dump() }}
but in your debugger.
Upvotes: 4
Reputation: 28249
You can use the debug
tag, which is documented here.
{% debug expression.varname %}
Edit: As of Twig 1.5, this has been deprecated and replaced with the new dump
function (note, it's now a function and no longer a tag). See also: The accepted answer above.
Upvotes: 30
Reputation: 6434
So I got it working, partly a bit hackish:
twig: debug: 1
in app/config/config.yml
Add this to config_dev.yml
services:
debug.twig.extension:
class: Twig_Extensions_Extension_Debug
tags: [{ name: 'twig.extension' }]
sudo rm -fr app/cache/dev
print_r()
, I opened vendor/twig-extensions/lib/Twig/Extensions/Node/Debug.php
and changed print_r(
to d(
PS. I would still like to know how/where to grab the $twig environment to add filters and extensions.
Upvotes: 17
Reputation: 20045
For debugging Twig templates you can use the debug statement.
There you can set the debug setting explicitely.
Upvotes: 1