Twig 为什么细枝模板抛出“未知”;“倾倒”;为';使用if语句时的函数;开发和#x27;环境

Twig 为什么细枝模板抛出“未知”;“倾倒”;为';使用if语句时的函数;开发和#x27;环境,twig,symfony,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_语法:“中的未知“dump”函数 第13行的“search/search\u pet\u resul

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

{% if app.environment == 'dev' %}
    {{ dump(students) }}
{% endif %}
但在“prod”环境中,它抛出此错误,如var/logs/prod.log文件所示:

[2016-05-18 21:28:28]request.CRITICAL:未捕获的PHP异常 Twig_Error_语法:“中的未知“dump”函数 第13行的“search/search\u pet\u results.html.twig” /var/www/html/application/vendor/twig/twig/lib/twig/ExpressionParser.php 第573行{“异常”:“[object](细枝错误语法(代码:0):未知 \第行“search/search\u pet\u results.html.twig”中的“dump”函数 13.at/var/www/html/application/vendor/twig/twig/lib/twig/ExpressionParser.php:573)“} []


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

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

因此,您的config.yml可能与以下内容相同:

config.yml

尝试按以下方式进行修改,以便在所有环境中启用:

config.yml


希望此帮助

由于转储调用不可用,prod环境中出现错误

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

不要直接在if块中调用
dump()
,只需包含一个单独的细枝文件,其中包含
dump()
调用

更改:

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

dump.html.twig内容:

{{ dump(foo) }}

这与我最近回答的问题类似。我发现Twig在尝试调用不存在的函数时抛出
Twig\u错误\u语法
异常,即使它位于无法访问的
if
块中。就像你的问题一样

事实上,我也是这么说的:

根据设计,
dump()
功能仅在
dev
和中可用
测试
环境,以避免在 生产。实际上,尝试使用
prod
环境将导致PHP错误

因此,要么从您的小树枝文件中删除所有
dump
s,要么创建一个变通方法

我只想
dump
在生产环境中什么都不做,所以我会创建一个名为
dump
的自定义细枝函数,它不会返回任何东西

遗憾的是,我不知道您应该在代码库的哪个位置添加一个只在生产环境中使用的新函数。但这是牛肉:

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

在我看来,您的环境设置不正确!您是否尝试输出正在生产中的“app.environment”?更改是它将被设置为dev:)Hi there@Phorce。当我在我的小树枝文件中添加
应用程序环境:{{app.Environment}

时,我的“app_dev.php”链接显示“Application Environment:dev”,而我的常规产品环境显示“Application Environment:prod”。谢谢你的帮助,但是我做了改变,但是没有用。我还为dev和prod环境运行了
php bin/console cache:clear
。在我的config.yml中,我在twig:config下还有
strict_变量:“%kernel.debug%”
。我还应该提到
{{dump(students)}}
在我的“dev”环境中运行良好;因此,如果这是您的意思,那么就不需要“启用”它-->了。还有其他建议吗?我的问题是“如果”不能正常工作。为每个转储调用创建单独的文件似乎相当麻烦,至少如果您在多个地方使用了转储。@martias您不必这样做。您可以将要转储的变量传递到dump.html.twig<代码>{%include'dump.html.twig'和{'foo':bar}%}
{% if app.environment == 'dev' %}
    {% include 'dump.html.twig' %}
{% endif %}
{{ dump(foo) }}
$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;
    }));
}