Twig with Symfony 2 displaying json encoded variables different between prod and dev

泄露秘密 提交于 2019-12-04 11:51:58

问题


We're building a Symfony 2 application that sends some data from controller to view:

Controller

$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>

Result

On dev the result looks like this and works as expected:

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

On the other hand, on prod the result is encoded in a different manner, thus displaying errors in console:

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

Console Error: Uncaught SyntaxError: Unexpected token &

What generates this difference?


回答1:


Edit: Also check @Lulhum's solution below. Up-vote it if it's better so I will select it as the correct answer.

The "problem" was Twig autoescaping variables. I used Twig's raw filter to skip autoescaping like this:

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

Now it prints:

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

Links: Symfony 2 Docs - Output escaping




回答2:


It is better to avoid using the raw filter when possible. You can here achieve the same behavior with the escape filter (doc).

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


来源:https://stackoverflow.com/questions/19552673/twig-with-symfony-2-displaying-json-encoded-variables-different-between-prod-and

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!