如何在dump()之后杀死Twig中的执行?

时间:2015-05-01 09:21:51

标签: symfony twig

我使用Twig中的{{ dump(foo) }}函数来调试我的模板。但是,如果模板在dump()函数之后抛出错误,您将只看到Symfony的调试页面,通知您错误。您可以明显地在Twig模板中注释掉有问题的代码行,但是有一种方法可以立即终止模板的执行,这样dump()函数的输出就是屏幕上打印的最后一个东西。我天真地想着{{ dump(foo) }} {{ die() }}之类的东西。关于如何实现这一目标的任何想法?

2 个答案:

答案 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的错误页面上使用。

哦,好吧,仅使用评论({# ... #})来禁用模板的非工作部分呢?