我正在使用{{ dump(foo) }}Twig中的函数来调试我的模板.但是,如果模板在dump()函数之后抛出错误,您将只看到Symfony的调试页面,通知您错误.您可以明显地在Twig模板中注释掉有问题的代码行,但是有一种方法可以立即终止模板的执行,这样dump()函数的输出就是屏幕上打印的最后一个东西.我天真地想着类似的东西{{ dump(foo) }} {{ die() }}.关于如何实现这一目标的任何想法?
qoo*_*mao 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';
}
}
Run Code Online (Sandbox Code Playgroud)
您的服务文件(YAML)..
services:
acme.twig.dev_extension:
class: Acme\SomeBundle\Twig\DevExtension
tags:
- { name: twig.extension }
Run Code Online (Sandbox Code Playgroud)
此外,您可以传入当前环境,然后根据环境静默地死亡或失败,以防您出于某种原因将代码留在代码中.
你的枝条延长..
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 '';
}
...
}
Run Code Online (Sandbox Code Playgroud)
您的服务文件..
services:
acme.twig.dev_extension:
class: Acme\SomeBundle\Twig\DevExtension
arguments:
- %kernel.environment%
tags:
- { name: twig.extension }
Run Code Online (Sandbox Code Playgroud)
我认为您不应该在 Twig 模板内停止 PHP 执行(即使这可以使用自定义 Twig 扩展)。结果不会是您所期望的,因为在渲染模板和将其发送到浏览器之间还发生了很多事情。如果你只是停止执行,所有这些都不会再发生,我怀疑你会得到一个简单的白页。
也许将变量转储到控制器内是更好的方法。这样做会将转储输出发送到 Web Profiler 工具栏,该工具栏甚至在 symfony 的错误页面上也可用。
哦,那么,仅使用注释 ( {# ... #}) 来禁用模板的非工作部分怎么样?