为什么twig模板会抛出未知的" dump"使用if语句为' dev'环境?

时间:2016-05-19 04:34:18

标签: twig symfony

我有一个使用Symfony3的树枝模板,如下所示:

{% if app.environment == 'dev' %}
    {{ dump(students) }}
{% endif %}

但是在' prod'环境会抛出此错误,如var / logs / prod.log文件中所示:

  

[2016-05-18 21:28:28] request.CRITICAL:未捕获PHP异常   Twig_Error_Syntax:" Unknown" dump"功能   "搜索/ search_pet_results.html.twig"在第13行。"在   /var/www/html/petition/vendor/twig/twig/lib/Twig/ExpressionParser.php   第573行{"例外":" [对象](Twig_Error_Syntax(代码:0):未知   \"转储\"函数在" search / search_pet_results.html.twig \"在线   13.在/var/www/html/petition/vendor/twig/twig/lib/Twig/ExpressionParser.php:573)"}   []

我的树枝模板的任何建议?不知道该尝试什么,因为这是"假设"工作。

3 个答案:

答案 0 :(得分:3)

默认情况下,转储功能不可用,如文档here中所述。必须将debug标志设置为true才能在环境中启用。该标志位于twig部分下的config.yml文件中。通常该值取自内核值。

所以你的config.yml可能与以下内容相同:

config.yml

# Twig Configuration
twig:
    debug:            "%kernel.debug%"

尝试修改如下,以便在所有环境中启用:

config.yml

# Twig Configuration
twig:
    debug:            true

希望这个帮助

答案 1 :(得分:1)

出现prod环境中的错误,因为转储调用不可用。

但是您不需要将debug设置为true,因为您通常不希望在prod环境中执行此操作。
对于这个问题,有一个非常简单和更好的解决方法。

不是直接在if块中调用dump(),而是只包含一个包含dump()调用的单独twig文件。

变化:

{% if app.environment == 'dev' %}
    {{ dump(foo) }}
{% endif %}

成:

{% if app.environment == 'dev' %}
    {% include 'dump.html.twig' %}
{% endif %}

dump.html.twig内容:

{{ dump(foo) }}

答案 2 :(得分:1)

这与我最近回答的问题Check if a custom Twig function exists and then call it类似。我发现Twig在尝试调用不存在的函数时抛出Twig_Error_Syntax异常,即使它位于无法访问的if块内。就像你的问题一样。

实际上,Symfony's documentation of dumping也是这样说的:

  

按照设计,dump()功能仅适用于dev和   test个环境,以避免泄露敏感信息   生产。实际上,尝试在dump()中使用prod函数   环境将导致PHP错误。

因此,要么从Twig文件中删除所有dump,要么创建一个解决方法。

除了dump我不会在生产环境中做任何事情 - 所以我会创建一个名为dump的自定义Twig函数,它不会返回任何内容

可悲的是,我不知道您的代码库在哪个位置应该添加一个仅在生产环境中使用的新功能。但这是牛肉:

$twig = new Twig_Environment(/* ... */);

// Pseudo code: check environment
if ($environment !== 'dev' && $environment !== 'test') {
    $twig->addFunction(new Twig_Function('dump', function() {
        return null;
    }));
}

// Or you can also check whether the `dump` function already exists
if ($twig->getFunction('dump') === false) {
    $twig->addFunction(new Twig_Function('dump', function() {
        return null;
    }));
}

然后您可以安全地在所有环境中使用dump;在生产环境中,它只输出任何内容,但也不会抛出异常。