使用Symfony 2的Twig显示prod和dev之间不同的json编码变量

VMC*_*VMC 9 php json escaping symfony twig

我们正在构建一个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)
    )
);
Run Code Online (Sandbox Code Playgroud)

视图

<script language="javascript">
    user = $.parseJSON("{{ userJSON }}");
</script>
Run Code Online (Sandbox Code Playgroud)

结果

在dev结果看起来像这样和按预期工作:

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

另一方面,prod结果以不同的方式编码,从而在控制台中显示错误:

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

控制台错误:未捕获的SyntaxError:意外的令牌&

什么产生这种差异?

VMC*_*VMC 19

编辑:另请查看@ Lulhum的解决方案.如果它更好,则向上投票,因此我将其选为正确答案.

"问题"是Twig autoescaping变量.我使用Twig的raw过滤器来跳过这样的自动转换:

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

现在它打印:

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

链接: Symfony 2 Docs - 输出转义


Lul*_*hum 5

最好避免使用raw过滤器。您可以在此处使用escape过滤器(doc)实现相同的行为。

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