Twig在Symfony 2中显示编码为Json的变量在生产环境和开发环境中不同

9
我们正在构建一个Symfony 2应用程序,该应用程序从控制器向视图发送一些数据:

控制器

$user = array(
    'configuration' => array(
        'levels' => array(
            'warning' => 0.05,
            'danger'  => 0.10,
        ),
    ),
);

return $this->render(
    'MyWebsiteBundle:Core:searchResults.html.twig',
    array(
        'userJSON'  => json_encode($user)
    )
);

View

<script language="javascript">
    user = $.parseJSON("{{ userJSON }}");
</script>

结果

dev环境中,结果如下并且按照预期工作:

user = $.parseJSON("\x7B\x22configuration\x22\x3A\x7B\x22levels\x22\x3A\x7B\x22warning\x22\x3A0.05,\x22danger\x22\x3A0.1\x7D\x7D\x7D");

另一方面,在prod中,结果以不同的方式进行编码,因此在控制台上显示错误:

user = $.parseJSON("{&quot;configuration&quot;:{&quot;levels&quot;:{&quot;warning&quot;:0.05,&quot;danger&quot;:0.1}}}");

控制台错误:Uncaught SyntaxError:Unexpected token &

什么会引起这种差异?

2个回答

19

编辑: 请查看下面 @Lulhum 的解决方案。如果更好,请给它点赞,这样我就会选择它作为正确答案。

"问题"是Twig自动转义变量。我使用了Twig的raw过滤器来跳过自动转义,方法如下:

<script language="javascript">
    user = $.parseJSON('{{ userJSON | raw }}');
</script>

现在它会打印:

user = $.parseJSON('{"configuration":{"levels":{"warning":0.05,"danger":0.1}}}');

链接: Symfony 2 文档 - 输出转义


6

尽可能避免使用raw过滤器。您可以使用escape 过滤器 (文档) 来实现相同的行为。

<script language="javascript">
    user = $.parseJSON('{{ userJSON | escape('js') }}');
</script>

1
天啊,你刚刚救了我的命!我试过了1000种解决方案,事实上我只是将“raw”替换为“escape('js')”,然后它就可以正常工作了!谢谢。 - Kvn91
对我来说也是一样的!即使打印出来的字符串对人类来说难以阅读,但它仍然像魔法一样运行良好。 - Vincent Decaux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接