仅显示已获得的内容的视图层模式就可以了,而且一切都很好,但是您如何知道可用的呢?TWIG中是否有“列出所有定义的变量”功能?有没有一种方法可以转储变量?
我通过搜索找到的解决方案是定义一个函数,通过注入一个函数可以使用现有的php调试工具,但是我发现的所有引用都包括这两行漂亮的代码,但是没有在哪里指定放置它们。基于他们需要定义$ loader变量的事实,我尝试了/app/config/autoload.php,但是那里的$ loader类型错误。我在哪里放置用于添加树枝功能的php代码?
仅显示已获得的内容的视图层模式就可以了,而且一切都很好,但是您如何知道可用的呢?TWIG中是否有“列出所有定义的变量”功能?有没有一种方法可以转储变量?
我通过搜索找到的解决方案是定义一个函数,通过注入一个函数可以使用现有的php调试工具,但是我发现的所有引用都包括这两行漂亮的代码,但是没有在哪里指定放置它们。基于他们需要定义$ loader变量的事实,我尝试了/app/config/autoload.php,但是那里的$ loader类型错误。我在哪里放置用于添加树枝功能的php代码?
Answers:
从Twig 1.5开始,正确的答案是使用转储功能。它在Twig文档中有完整记录。这是在Symfony2中启用此功能的文档。
{{ dump(user) }}
{{ dump() }}
转储所有变量时,它将返回空白页。还有其他转储变量的方法吗?
dump
,显然dump
不是问题所在。如果您无法解决,我建议您发布一个新问题。
您可以使用debug
标签,该标签在此处记录。
{% debug expression.varname %}
编辑:从Twig 1.5开始,此功能已被弃用,并替换为新dump
功能(请注意,它现在是一个功能,而不再是标记)。另请参阅:上面接受的答案。
Unknown tag name "debug"
扩展您的配置(在全局config.yml
或config_dev.yml
):github.com/symfony/symfony-docs/issues/455#issuecomment-1884861
所以我让它工作了,部分有点骇人听闻:
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: debug: 1
因为它是从您的前控制器环境继承此信息。否则,您可能最终会在产品环境中无意间输出调试信息。只要您在开发环境中工作,默认情况下就会启用它,而在产品环境中则禁用它。
如果您在应用程序中使用Twig作为组件,则可以执行以下操作:
$twig = new Twig_Environment($loader, array(
'autoescape' => false
));
$twig->addFilter('var_dump', new Twig_Filter_Function('var_dump'));
然后在您的模板中:
{{ my_variable | var_dump }}
$twig = new Twig_Environment($loader, array(...
?
如果您将Twig用作独立组件,这是一些如何启用调试的示例,因为dump(variable)函数不太可能直接使用
这是在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'
));
转储所有自定义变量:
<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 %}
您可以使用我的插件为您做到这一点(可以很好地格式化输出):
由于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时,通过debug选项
$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语句。
您可以在那里明确设置调试设置。
Unknown tag name "debug"
错误。
正如大多数优秀的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 }
注册后,您现在可以在树枝模板中的任何位置执行此操作:
{{ breakpoint() }}
现在,您可以使用XDebug,执行将暂停,并且您可以看到Context和Environment的所有属性。
玩得开心!:-D
您可以使用转储功能并像这样打印
{{ dump(MyVar) }}
但也有一件好事,如果您没有为转储函数设置任何参数,它将打印所有可用变量,例如
{{ dump() }}