为什么 twig 模板在“dev”环境中使用 if 语句时会抛出未知的“dump”函数?

问题描述 投票:0回答:4

我有一个使用 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:“未知的“转储”功能 “search/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\”行中的“dump”函数 13.在/var/www/html/petition/vendor/twig/twig/lib/Twig/ExpressionParser.php:573)"} []

对我的树枝模板有什么建议吗?不知道要尝试什么,因为这是“应该”起作用的。

twig symfony
4个回答
3
投票

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

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

config.yml

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

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

config.yml

# Twig Configuration
twig:
    debug:            true

希望这有帮助


3
投票

prod环境出现错误是因为dump调用不可用。

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

不要直接在 if 块中调用

dump()
,只需包含一个单独的树枝文件,其中包含
dump()
调用。

改变:

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

进入:

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

dump.html.twig 内容:

{{ dump(foo) }}

1
投票

这与我最近回答的问题检查是否存在自定义 Twig 函数然后调用它类似。我发现 Twig 在尝试调用不存在的函数时会抛出

Twig_Error_Syntax
异常,即使它位于无法访问的
if
块内。就像你的问题一样。

实际上,Symfony 的转储文档也这么说:

根据设计,

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
;在生产环境中,它只是不输出任何内容,但也不会抛出异常。


0
投票

文档说:

转储功能默认不可用。创建 Twig 环境时,必须显式添加 \Twig\Extension \DebugExtension 扩展:

    $twig = new \Twig\Environment($loader, [
        'debug' => true,
        // ...
    ]);
    $twig->addExtension(new \Twig\Extension\DebugExtension());

即使启用,如果调试选项打开,转储功能也不会显示任何内容?环境未启用(以避免泄漏生产服务器上的调试信息)。

因此,除了将

debug
设置为 true 之外,您还需要启用
DebugExtension

© www.soinside.com 2019 - 2024. All rights reserved.