You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Twig的raw过滤器失效?JavaScript变量遭URL编码

问题分析与解决方案

核心原因

你遇到的问题不是Twig忽略了raw过滤器,而是**path()函数本身会对路由参数做URL编码**——这是路由生成的默认逻辑,和Twig的自动转义完全是两回事:

  • raw过滤器只能取消Twig的自动转义(比如阻止把"转成"),但管不了path()内部对参数的编码处理;
  • 你传入的"' + full['id'] + '"是一段JS代码片段,path()会把它当成普通字符串进行URL编码,所以才会出现%27%20+%20full%5B%27id%27%5D%20+%20%27这类编码后的内容。

正确实现方式

不要把JS代码片段作为参数传给path(),而是拆分路径生成逻辑:

方法1:生成基础路径后用JS替换占位符

<script>
// 先用Twig生成带占位符的完整路径
const baseEditPath = "{{ path('article_edit', {id: 'ID_PLACEHOLDER'}) }}";
// 用JS变量替换占位符
const finalEditPath = baseEditPath.replace('ID_PLACEHOLDER', full['id']);
print `<a href="${finalEditPath}">Linktext</a>`;
</script>

方法2:手动拼接固定路径与JS变量

如果路由结构简单,也可以直接拆分固定部分和动态部分:

<script>
// 固定部分用Twig生成,动态部分用JS变量拼接
print `<a href="{{ path('article_edit_base') }}${full['id']}/edit">Linktext</a>`;
// 或者直接写死固定路径(如果路由结构稳定)
print `<a href="/articles/${full['id']}/edit">Linktext</a>`;
</script>

注:article_edit_base是假设你有一个指向/articles/的路由,若没有可以直接写死固定路径段。

补充说明

Twig的path()设计目的是生成符合URL规范的完整路径,它会确保所有参数都经过URL编码以避免非法字符,所以不要试图把非URL参数的内容(比如JS代码)传给它作为路由参数,否则必然会被编码。

内容的提问来源于stack exchange,提问作者Vestalis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 07:37:22