我使用Twig中的{{ dump(foo) }}
函数来调试我的模板。但是,如果模板在dump()函数之后抛出错误,您将只看到Symfony的调试页面,通知您错误。您可以明显地在Twig模板中注释掉有问题的代码行,但是有一种方法可以立即终止模板的执行,这样dump()函数的输出就是屏幕上打印的最后一个东西。我天真地想着{{ dump(foo) }} {{ die() }}
之类的东西。关于如何实现这一目标的任何想法?
答案 0 :(得分:14)
您可以创建一个处理此问题的简单枝条扩展。
您的枝条文件..
namespace Acme\SomeBundle\Twig;
class DevExtension extends \Twig_Extension
{
/**
* {@inheritdoc}
*/
public function getFunctions()
{
return array(
new \Twig_SimpleFunction('die', 'die'),
);
}
/**
* {@inheritdoc}
*/
public function getName()
{
return 'acme_dev';
}
}
您的服务档案(YAML)..
services:
acme.twig.dev_extension:
class: Acme\SomeBundle\Twig\DevExtension
tags:
- { name: twig.extension }
另外您可以传入当前环境,然后根据环境无声地死亡或失败,以防您出于某种原因将代码留在代码中。
你的枝条延长..
class DevExtension extends \Twig_Extension
{
/**
* @string
*/
private $environment;
/**
* @param string $environment
*/
public function __construct($environment)
{
$this->environment = $environment;
}
/**
* {@inheritdoc}
*/
public function getFunctions()
{
return array(
new \Twig_SimpleFunction('die', array($this,'killRender')),
);
}
/**
* @param string|null $message
*/
public function killRender($message = null)
{
if ('dev' === $this->environment) {
die($message);
}
return '';
}
...
}
您的服务档案..
services:
acme.twig.dev_extension:
class: Acme\SomeBundle\Twig\DevExtension
arguments:
- %kernel.environment%
tags:
- { name: twig.extension }
答案 1 :(得分:2)
我认为您不应该在twig模板中停止PHP执行(尽管使用自定义Twig扩展可以实现)。结果将不是您所期望的,因为在渲染模板和将其发送到浏览器之间会发生更多的事情。如果你只是停止执行所有这一切都不会再发生了,我怀疑你会得到一个简单的白页。
也许这是将变量转储到控制器内的更好方法。这样做会将转储输出发送到Web Profiler工具栏,该工具栏甚至可以在symfony的错误页面上使用。
哦,好吧,仅使用评论({# ... #}
)来禁用模板的非工作部分呢?