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

Posted

技术标签:

【中文标题】带有 Symfony 2 的 Twig 显示 prod 和 dev 之间不同的 json 编码变量【英文标题】:Twig with Symfony 2 displaying json encoded variables different between prod and dev 【发布时间】:2013-11-02 09:04:00 【问题描述】:

我们正在构建一个 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)
    )
);

查看

<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");

控制台错误:未捕获的 SyntaxError: Unexpected token &

是什么产生了这种差异?

【问题讨论】:

【参考方案1】:

编辑:还要检查下面@Lulhum 的解决方案。如果它更好,请投票,所以我会选择它作为正确答案。

“问题”是 Twig 自动转义变量。我使用 Twig 的 raw 过滤器来跳过自动转义,如下所示:

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

现在打印出来了:

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

链接: Symfony 2 Docs - Output escaping

【讨论】:

【参考方案2】:

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

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

【讨论】:

天哪,你救了我的命!正在尝试 1000 种解决方案,实际上我只是将“raw”替换为“escape('js')”,效果很好!谢谢 我也一样!即使打印出来的字符串对于人类来说是无法阅读的,也能像魅力一样发挥作用

以上是关于带有 Symfony 2 的 Twig 显示 prod 和 dev 之间不同的 json 编码变量的主要内容,如果未能解决你的问题,请参考以下文章

symfony 2 twig 限制文字长度并放三个点

从 Symfony2/Twig 中的 2 位国家代码获取翻译的国家名称?

如何用twig和symfony在输入中显示日期?

如何使用自定义函数 Twig-symfony

Symfony 表单集合 Twig 渲染

使用 Twig 处理动态 Javascript 文件