dump() 后如何终止 Twig 中的执行?

How to kill execution in Twig after dump()?

我正在使用 Twig 中的 {{ dump(foo) }} 函数来调试我的模板。但是,如果模板在 dump() 函数之后抛出错误,您只会看到 Symfony 的调试页面通知您错误。您显然可以在 Twig 模板中注释掉有问题的代码行,但是有没有办法在之后立即终止模板的执行,以便 dump() 函数的输出是屏幕上最后打印的内容。我天真地在想 {{ dump(foo) }} {{ die() }} 这样的东西。关于如何实现这一点有什么想法吗?

我认为您不应该停止 PHP 在您的 Twig 模板内执行(即使这可以使用自定义 Twig 扩展)。结果不会是您所期望的,因为在呈现模板和将其发送到浏览器之间发生了很多事情。如果你简单地停止执行,所有这一切都不会再发生,我怀疑你会得到一个简单的白页。

也许将变量转储到控制器中是更好的方法。这样做会将转储输出发送到 Web 分析器工具栏,该工具栏甚至在 symfony 的错误页面上也可用。

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

您可以创建一个简单的 twig 扩展来处理这个问题。

你的树枝文件..

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 }