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

jucafojl  于 2023-10-24  发布在  其他
关注(0)|答案(3)|浏览(116)

我有一个树枝模板使用Symfony 3像follwing:

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

但在'prod'环境中,它会抛出此错误,显示在var/logs/prod.log文件中:
[2016-05-18 21:28:28]请求。关键:Uncaught PHP Exception Twig_Error_Error:“Unknown“dump”function in“search/search_pet_results.html.twig”at line 13.”at/var/www/html/petition/vendor/twig/lib/Twig/ExpressionParser.php line 573 {“exception”:“[object](Twig_Error_Error(code:0):Unknown \“dump\”function in \“search/search_pet_results.html.twig\”at line 13. at /var/www/html/petition/vendor/twig/lib/Twig/ExpressionParser.php:573)"} []
对我的小树枝模板有什么建议吗?不知道该尝试什么,因为这是“应该”工作。

wgx48brx

wgx48brx1#

如文档here中所述,dump函数默认不可用。您必须将debug标志设置为true才能在环境中启用。该标志位于config.yml文件中的twig部分下。通常该值取自内核值。
因此,您的config.yml可能与以下内容相同:
config.yml

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

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

# Twig Configuration
twig:
    debug:            true

希望这对你有帮助

cwxwcias

cwxwcias2#

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 content:

{{ dump(foo) }}
hs1ihplo

hs1ihplo3#

这类似于我最近回答的问题检查是否存在自定义Twig函数,然后调用它。我发现Twig在尝试调用不存在的函数时抛出Twig_Error_Syntax异常,即使它位于无法访问的if块中。就像你的问题一样。
其实Symfony's documentation of dumping也是这么说的:
根据设计,dump()函数仅在devtest环境中可用,以避免在生产中泄漏敏感信息。实际上,尝试在prod环境中使用dump()函数将导致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;在生产环境中,它只是不输出任何内容,而且也不会抛出异常。

相关问题