新闻详情

新闻详情

首页 / 资讯中心 / 详情

Twig keys 过滤器详解:从模板语法到 CoreExtension 源码实现

发布时间:2026/9/25 3:42:07来源:尧图网络
Twig keys 过滤器详解:从模板语法到 CoreExtension 源码实现
后端【免费下载链接】TwigTwig, the flexible, fast, and secure template language for PHP项目地址https://gitcode.com/gh_mirrors/tw/Twig点击查看免费下载本篇指南围绕 Twig 模板语言中的keys过滤器展开它如何从序列sequence或映射mapping中提取全部键、在{% for %}循环和表达式链中的典型用法以及CoreExtension::keys()内部如何区分数组、可遍历对象和其他输入类型。读完后你将掌握keys的完整行为边界包括null、Traversable对象等特殊情况并能理解其底层实现与测试证据从而在模板开发中放心地对任意可迭代数据做键值操作。一、keys 过滤器的基本用法keys过滤器返回一个序列或映射的所有键。最典型的场景是当你只需要遍历键、而不需要键对应的值时{% for key in [a, b, c, d]|keys %} {{ key }} {% endfor %} {# outputs: 0 1 2 3 #} {% for key in {a: a_value, b: b_value}|keys %} {{ key }} {% endfor %} {# outputs: a b #}两个示例覆盖了 PHP 数组的两种形态序列[a, b, c, d]是一个数字索引的列表keys提取出0 1 2 3映射{a: a_value, b: b_value}是字符串键的关联数组keys提取出a b。官方文档特别指出Twig 内部使用 PHP 的array_keys函数见 doc/filters/keys.rst。这句话点明了数组分支的实现方式但真实源码中的行为比array_keys一行代码要丰富得多——因为 Twig 还要处理可遍历对象这一类输入。二、源码实现CoreExtension::keys() 的三条分支keys过滤器在核心扩展中注册注册点位于 CoreExtension.phpnew TwigFilter(keys, [self::class, keys]),实际实现是CoreExtension的静态方法keys()位于 CoreExtension.php。完整逻辑如下public static function keys($array): array { if ($array instanceof \Traversable) { while ($array instanceof \IteratorAggregate) { $array $array-getIterator(); } $keys []; if ($array instanceof \Iterator) { $array-rewind(); while ($array-valid()) { $keys[] $array-key(); $array-next(); } return $keys; } foreach ($array as $key $item) { $keys[] $key; } return $keys; } if (!\is_array($array)) { return []; } return array_keys($array); }从源码结构看该方法按输入类型分成三条处理路径Traversable分支如果输入实现了\Traversable先用while循环不断调用getIterator()剥掉IteratorAggregate的外壳这样可以支持层层包装聚合迭代器的对象直到拿到真正的\Iterator为止随后调用rewind()从头遍历通过key()逐个收集键。若最终对象并非原生Iterator则退化为foreach收集键。非数组分支既不是可遍历对象、又不是数组例如null直接返回空数组[]。数组分支直接调用 PHP 内建的array_keys()这与文档描述一致。这种分层设计解释了为什么keys不仅能处理模板里书写的字面量数组还能处理传入模板上下文的迭代器对象。三、边界行为null、Traversable 与 SimpleXMLElement单元测试 CoreTest.php 中的testArrayKeysFilter方法通过provideArrayKeyCases数据提供了官方认可的边界行为清单public static function provideArrayKeyCases() { $array [a a1, b b1, c c1]; $keys array_keys($array); return [ [$keys, $array], [$keys, new CoreTestIterator($array, $keys)], [$keys, new CoreTestIteratorAggregate($array, $keys)], [$keys, new CoreTestIteratorAggregateAggregate($array, $keys)], [[], null], [[a], new \SimpleXMLElement(xmla/a/xml)], ]; }由此可以确认几条关键事实普通数组返回与array_keys()一致的结果Iterator/IteratorAggregate/ 双层包装的IteratorAggregateAggregate都能正确提取出全部键验证了源码中getIterator()剥壳逻辑的有效性null输入返回空数组[]模板中null|keys不会报错而是得到空列表SimpleXMLElementnew \SimpleXMLElement(xmla/a/xml)的键是[a]说明 XML 元素对象同样可以通过该过滤器提取属性名。四、与 for 标签的配合实际测试用例集成测试夹具 tags/for/keys.test 演示了文档示例对应的完整运行结果{% for key in items|keys %} * {{ key }} {% endfor %}配合数据[items [a, b]]预期输出为* 0和* 1。另一个夹具 tags/for/objects.test 展示了keys在迭代器对象上的表现模板先以{% for key, value in items %}遍历一个实现了\Iterator的ItemsIterator对象再以{% for key in items|keys %}单独提取键期望输出为* foo和* bar——即迭代器内部数组的字符串键。此外keys在表达式链中也经常作为中间环节出现例如 filters/merge.test 用items|merge({bar: foo})|keys|join校验合并后的键集合filters/slice.test 用[1, 2, 3, 4]|slice(1, 2)|keys|join()验证切片后键是否保留。这说明keys是构建复杂表达式管道的常用构件。五、沙箱模式与旧版内部函数的兼容性说明在沙箱sandbox环境下keys同样受到白名单管控。SandboxTest.php 中存在形如{{ arr|keys|join(,) }}的用例其中keys被列入允许的过滤器列表[column, first, keys]表明在Sandbox开启时只有显式放行的过滤器才能被模板调用keys属于核心过滤器之一。对于从旧版 Twig 迁移的读者还有一个兼容性细节历史上编译产物会调用内部函数twig_get_array_keys_filter()该函数保留在 src/Resources/core.php 中并自 Twig 3.9 起被标记为deprecated内部只是转发到CoreExtension::keys($array)并触发废弃提示。因此在当前仓库版本中应当以CoreExtension::keys()为准来理解该过滤器的行为遗留函数仅服务于向后兼容。六、小结何时使用 keys只需要键而不需要值时items|keys配合{% for %}是最直接的写法需要在表达式中对键做join、first、length等后续操作时keys是提取键集的标准入口输入为null时得到空数组而非错误可以放心用于可能缺失的上下文变量传入迭代器含多层IteratorAggregate包装时实现层会自动解包并提取键行为与数组一致。相关路径索引官方文档 doc/filters/keys.rst、过滤器实现 src/Extension/CoreExtension.php、单元测试 tests/Extension/CoreTest.php、集成夹具 tests/Fixtures/tags/for/keys.test 与 tests/Fixtures/tags/for/objects.test。赞分享后端【免费下载链接】TwigTwig, the flexible, fast, and secure template language for PHP项目地址https://gitcode.com/gh_mirrors/tw/Twig点击查看免费下载相关推荐Twig IntlExtension 深度解析currency_symbol 过滤器从用法到源码实现Twig IntlExtension 深度解析currency_symbol 过滤器从用法到源码实现 currency_symbol 是 Twig 官方 In后端Twig column 过滤器详解从一行模板语法到 PHP array_column 与沙箱安全检查Twig column 过滤器详解从一行模板语法到 PHP array_column 与沙箱安全检查 column 是 Twig 核心过滤器之一用于从一个对后端Twig convert_encoding 过滤器基于 iconv 的模板层字符编码转换详解Twig convert_encoding 过滤器基于 iconv 的模板层字符编码转换详解 在涉及多语言数据源如日文、俄文、中文内容混排的 PHP 项目后端上一篇Davinci大数据可视化终极性能优化指南10个技巧让海量数据流畅展示下一篇数学问题解决数据集从学术研究到产业应用的全流程指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Flink + Hologres 云原生实时数仓:从能跑到敢上生产的调优与避坑指南 2026/9/25 4:57:41

Flink + Hologres 云原生实时数仓:从能跑到敢上生产的调优与避坑指南

简介:这份PDF文档面向数据架构师、实时计算开发者和数据平台负责人,聚焦云原生环境下实时数仓的构建与优化,帮助解决传统数仓延迟高、Lambda架构复杂、资源消耗大等痛点。内容围绕Flink与Hologres组合展开,涵盖HTAP与HSAP技术理念…

阅读更多 →
shuohao-skills 完全指南:5 个 AI 短剧制作 Skill,把一本小说直接变成角色设定、剧本与分镜投产包 2026/9/25 4:57:41

shuohao-skills 完全指南:5 个 AI 短剧制作 Skill,把一本小说直接变成角色设定、剧本与分镜投产包

shuohao-skills 完全指南:5 个 AI 短剧制作 Skill,把一本小说直接变成角色设定、剧本与分镜投产包 【免费下载链接】shuohao-skills AI 短剧制作的 skill 集合:拆角色、排大纲、出场景与道具设定、写剧本、切分镜 | Agent skills for AI shor…

阅读更多 →
企业 AI Agent Harness Engineering 安全合规白皮书:等保三级要求下的数据隐私保护方案与 TaoToken 统一 Key 通道配置 2026/9/25 4:57:40

企业 AI Agent Harness Engineering 安全合规白皮书:等保三级要求下的数据隐私保护方案与 TaoToken 统一 Key 通道配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Metasploitable2 靶机安装教程:VMware 网络配置与 Kali 连通性验证 2026/9/25 4:57:34

Metasploitable2 靶机安装教程:VMware 网络配置与 Kali 连通性验证

1. 为什么我至今还在用 Metasploitable2 做入门靶机搞安全入门的朋友大概率都经历过这个阶段:装完 Kali Linux,打开终端,面对一堆工具却不知道从哪下手。工具会敲命令,但不知道打谁、怎么打、打完看什么。这时候你需要的不是更多工…

阅读更多 →
SnowEyes:浏览器端实时敏感信息检测原理与实战 2026/9/25 4:57:34

SnowEyes:浏览器端实时敏感信息检测原理与实战

1. 雪瞳不是“爬虫”,而是浏览器端的敏感信息显微镜你打开一个网页,点开开发者工具,CtrlF 搜password、token、api_key、secret——这种操作我做过不下两百次。但每次都要手动翻 Network 面板、Sources 标签页、Console 输出、甚至 localStor…

阅读更多 →
华为MDE岗位:模型驱动工程在通信研发中的落地实践 2026/9/25 4:57:28

华为MDE岗位:模型驱动工程在通信研发中的落地实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉