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

tra*_*jan 10 symfony twig

我正在使用{{ 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)


Ste*_*rig 5

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

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

哦,那么,仅使用注释 ( {# ... #}) 来禁用模板的非工作部分怎么样?

  • 谢谢您的建议。我很欣赏在控制器内转储变量的观点。然而,在某些情况下(抱歉,我应该在我的问题中给出一个例子),您会获得嵌入的模板以及在 Twig 模板中创建的相当复杂的新变量,因此您无法真正将它们暴露在模板之外。另请注意,Qoop 给出的解决方案按预期工作,即模板部分渲染,并且 {{die()}} 之前的所有内容都得到回显。 (3认同)