查看图层模式,您只展示您所获得的内容,这很好,但您如何知道可用的内容?TWIG 中是否有“列出所有定义的变量”功能?有没有办法转储变量?
我通过搜索找到的解决方案是定义一个函数,我可以在其中通过注入一个函数来使用我现有的 php 调试工具,但是我发现的所有引用都包括这两行代码,但是没有指定在哪里放置它们。根据他们需要定义一个$loader变量的事实,我尝试了 /app/config/autoload.php 但那里的 $loader 类型错误。我在哪里放置用于添加树枝功能的 php 代码?
查看图层模式,您只展示您所获得的内容,这很好,但您如何知道可用的内容?TWIG 中是否有“列出所有定义的变量”功能?有没有办法转储变量?
我通过搜索找到的解决方案是定义一个函数,我可以在其中通过注入一个函数来使用我现有的 php 调试工具,但是我发现的所有引用都包括这两行代码,但是没有指定在哪里放置它们。根据他们需要定义一个$loader变量的事实,我尝试了 /app/config/autoload.php 但那里的 $loader 类型错误。我在哪里放置用于添加树枝功能的 php 代码?
从 Twig 1.5 开始,正确的答案是使用转储函数。它在 Twig 文档中有完整的记录。这是在 Symfony2 中启用此功能的文档。
{{ dump(user) }}
您可以使用此处debug
记录的标签。
{% debug expression.varname %}
编辑:从 Twig 1.5 开始,这已被弃用并替换为新dump
功能(注意,它现在是一个功能,不再是一个标签)。另请参阅:上面接受的答案。
如果您处于无法使用该dump
功能的环境(例如:opencart),您可以尝试:
{{ my_variable | json_encode(constant('JSON_PRETTY_PRINT')) }}
所以我让它工作了,部分有点hackish:
twig: debug: 1
在app/config/config.yml
将此添加到 config_dev.yml
services:
debug.twig.extension:
class: Twig_Extensions_Extension_Debug
tags: [{ name: 'twig.extension' }]
sudo rm -fr app/cache/dev
print_r()
,我打开vendor/twig-extensions/lib/Twig/Extensions/Node/Debug.php
并更改print_r(
为d(
PS。我仍然想知道如何/在哪里获取 $twig 环境以添加过滤器和扩展。
如果您在应用程序中使用 Twig 作为组件,您可以这样做:
$twig = new Twig_Environment($loader, array(
'autoescape' => false
));
$twig->addFilter('var_dump', new Twig_Filter_Function('var_dump'));
然后在您的模板中:
{{ my_variable | var_dump }}
转储所有自定义变量:
<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 %}
你可以使用我的插件,它会为你做到这一点(将很好地格式化输出):
如果您将 Twig 用作独立组件,这里有一些如何启用调试的示例,因为转储(变量)函数不太可能直接开箱即用
这是在 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'
));
{{ dump() }}
对我不起作用。PHP
窒息。我猜嵌套级别太深了。
debug
如果您使用的debugger
是这样的扩展,那么您真正需要的Twig 模板就是这样的扩展。
然后只需设置断点并{{ inspect() }}
在需要的地方调用即可。您将获得与 with 相同的信息,{{ dump() }}
但在您的调试器中。
由于 Symfony >= 2.6,有一个不错的VarDumper组件,但 Twig 的dump()
函数没有使用它。
要覆盖它,我们可以创建一个扩展:
在下面的实现中,不要忘记替换命名空间。
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';
}
}
此处的完整配方供您快速参考(请注意,所有步骤都是强制性的):
1)实例化Twig时,传递调试选项
$twig = new Twig_Environment(
$loader, ['debug'=>true, 'cache'=>false, /*other options */]
);
2)添加调试扩展
$twig->addExtension(new \Twig_Extension_Debug());
3)像@Hazarapet Tunanyan 指出的那样使用它
{{ dump(MyVar) }}
或者
{{ dump() }}
或者
{{ dump(MyObject.MyPropertyName) }}
要调试 Twig 模板,您可以使用debug 语句。
您可以在那里明确设置调试设置。
你可以编辑
/vendor/twig/twig/lib/Twig/Extension/Debug.php
并将the var_dump()
功能更改为\Doctrine\Common\Util\Debug::dump()
由于大多数优秀的 PHP 程序员都喜欢使用 XDebug 来实际单步调试正在运行的代码并实时观察变量的变化,因此使用dump()
感觉就像回到了糟糕的过去。
这就是我制作 Twig Debug 扩展并将其放在 Github 上的原因。
https://github.com/delboy1978uk/twig-debug
composer require delboy1978uk/twig-debug
然后添加扩展名。如果你不使用 Symfony,像这样:
<?php
use Del\Twig\DebugExtension;
/** @var $twig Twig_Environment */
$twig->addExtension(new DebugExtension());
如果你是这样,在你的服务 YAML 配置中是这样的:
twig_debugger:
class: Del\Twig\DebugExtension
tags:
- { name: twig.extension }
注册后,您现在可以在 twig 模板中的任何位置执行此操作:
{{ breakpoint() }}
现在,您可以使用 XDebug,执行将暂停,您可以看到 Context 和 Environment 的所有属性。
玩得开心!:-D
您可以使用转储功能并像这样打印
{{ dump(MyVar) }}
但也有一件好事,如果你没有为转储函数设置任何参数,它会打印所有可用的变量,比如
{{ dump() }}