ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Twig json_encode 过滤器实战:在模板中序列化数据并组合 JSON 编码选项

2026/9/25 5:23:15 拓冰建站 浏览量
Twig json_encode 过滤器实战:在模板中序列化数据并组合 JSON 编码选项 后端【免费下载链接】TwigTwig, the flexible, fast, and secure template language for PHP项目地址https://gitcode.com/gh_mirrors/tw/Twig点击查看免费下载本篇指南基于 Twig 官方文档 json_encode 过滤器 展开讲清楚json_encode过滤器在模板中的作用、options位掩码参数的用法以及如何用constant()函数与位运算操作符组合JSON_*常量并结合 src/Extension/CoreExtension.php 与 tests/Fixtures/filters/json_encode.test 的源码证据说明其底层实现与自动转义环境下的正确使用方式。一、json_encode过滤器把模板值序列化为 JSONjson_encode是 Twig 核心过滤器之一作用是将任意值转换为 JSON 字符串表示{{ data|json_encode() }}官方文档明确指出Twig 内部直接调用 PHP 原生的json_encode函数实现该过滤器。这一点可以从核心扩展的过滤器注册表得到印证——在 src/Extension/CoreExtension.php 的 encoding 分组中该过滤器被直接映射为 PHP 的全局函数json_encode而不是一个包装方法// encoding new TwigFilter(url_encode, [self::class, urlencode]), new TwigFilter(json_encode, json_encode), new TwigFilter(convert_encoding, [self::class, convertEncoding]),这意味着它没有任何 Twig 侧的额外封装逻辑序列化语义可序列化类型、对象属性可见性、失败时的false返回值等完全由 PHP 的json_encode决定行为可预期且与 PHP 侧保持一致。二、options参数位掩码与常量组合json_encode过滤器接受一个可选的options参数即 PHPjson_encode的选项位掩码bitmask。由于模板中不能直接书写 PHP 常量Twig 提供constant()函数在 src/Extension/CoreExtension.php 中注册用法详见 constant 函数文档来引用常量值。单选项的写法{{ data|json_encode(constant(JSON_PRETTY_PRINT)) }}若需要同时启用多个选项按照位掩码规则可以用 Twig 的位运算操作符b-and、b-xor、b-or优先级表见 operators_precedence.rst进行组合。官方文档给出的示例是格式化输出 十六进制编码引号{{ data|json_encode(constant(JSON_PRETTY_PRINT) b-or constant(JSON_HEX_QUOT)) }}b-or即按位或等价于 PHP 中JSON_PRETTY_PRINT | JSON_HEX_QUOT的写法。由于options就是一个整数位掩码任何JSON_*常量如JSON_UNESCAPED_UNICODE、JSON_HEX_TAG、JSON_THROW_ON_ERROR等 PHP 提供的 json_encode 选项常量都可以通过constant(...)引用后再用b-or叠加。三、与自动转义的关系为什么示例里总跟着rawjson_encode过滤器没有声明安全策略safe policy因此在开启自动转义的环境中它产生的字符串仍会经过 HTML 转义——引号会变成quot;之类的内容JSON 结构就会被破坏。这正是官方集成测试 tests/Fixtures/filters/json_encode.test 中每个用例都写成|json_encode|raw的原因{{ foo|json_encode|raw }} {{ foo|json_encode|raw }} {{ [foo, foo]|json_encode|raw }}测试期望的输出为未加转义的合法 JSONfoo foo [foo,foo]因此实战中的推荐顺序是json_encode之后紧跟raw关于raw的语义参见 raw 过滤器文档。典型场景包括在模板中向前端 hydration 脚本内联数据scriptwindow.__DATA__ {{ data|json_encode(constant(JSON_HEX_TAG) b-or constant(JSON_HEX_APOS))|raw }};/script用 HEX 类选项避免/script截断与引号冲突输出纯 JSON 响应体模板作为 API 视图调试时查看复杂嵌套数组的完整结构配合JSON_PRETTY_PRINT。四、特殊值的序列化行为以Markup为例序列化结果不仅取决于值本身还取决于值的类型。以 Twig 的 Markup 类为例该类实现了\JsonSerializable其jsonSerialize()返回内部字符串内容。上面的测试用例中foo正是new \Twig\Markup(foo, UTF-8)实例最终被序列化为foo而非带类名的对象 JSON。这说明凡是实现了JsonSerializable的对象经json_encode过滤器输出时都遵循各自jsonSerialize()的约定。从源码结构看Twig 对json_encode本身没有做任何结果包装或错误处理序列化失败例如遇到非 UTF-8 字符串时的行为与直接调用 PHPjson_encode完全一致需要在使用侧自行控制。五、使用要点小结要点说明依据底层实现直接调用 PHP 原生json_encode无 Twig 封装CoreExtension.php#L252选项参数options为位掩码通过constant(JSON_XXX)引用 PHP 常量json_encode.rst多选项组合用b-or按位或拼接多个常量operators_precedence.rst自动转义环境输出前追加raw否则会破坏 JSON 中的引号等字符json_encode.test对象序列化遵循JsonSerializable等 PHP 原生语义Markup.php掌握以上内容后你就可以在任意 Twig 模板中安全地把数组、对象或标量输出为合法 JSON并自由组合 PHP 提供的编码选项来适配前端嵌入、API 响应或调试展示等场景。赞分享后端【免费下载链接】TwigTwig, the flexible, fast, and secure template language for PHP项目地址https://gitcode.com/gh_mirrors/tw/Twig点击查看免费下载相关推荐打造你的专属桌面伙伴DyberPet开源桌宠框架深度解析打造你的专属桌面伙伴DyberPet开源桌宠框架深度解析 在数字化生活日益丰富的今天桌宠软件作为桌面伴侣已经超越了简单的装饰功能成为了集交互、养成、任务管桌面应用AI 应用交互助手Twig inky_to_html 过滤器用 twig/inky-extra 将 Inky 邮件模板编译为兼容 HTMLTwig inky_to_html 过滤器用 twig/inky extra 将 Inky 邮件模板编译为兼容 HTML 本文围绕 Twig 官方文档中 in后端Twig convert_encoding 过滤器基于 iconv 的模板层字符编码转换详解Twig convert_encoding 过滤器基于 iconv 的模板层字符编码转换详解 在涉及多语言数据源如日文、俄文、中文内容混排的 PHP 项目后端上一篇agents 仓库>下一篇GitHub Linguist集成测试指南确保模块协同工作创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考