新闻详情

新闻详情

首页 / 资讯中心 / 详情

Twig invoke 过滤器详解:用一行模板代码调用箭头函数

发布时间:2026/9/25 3:28:52来源:尧图网络
Twig invoke 过滤器详解:用一行模板代码调用箭头函数
后端【免费下载链接】TwigTwig, the flexible, fast, and secure template language for PHP项目地址https://gitcode.com/gh_mirrors/tw/Twig点击查看免费下载在 Twig 模板引擎中箭头函数arrow function自 3.15 起被广泛支持作为过滤器、函数、测试和宏的参数但从 3.19 开始它还可以被存入变量、稍后再调用——这就是invoke过滤器存在的意义。本篇基于 invoke 过滤器官方文档 展开结合当前仓库的源码与测试说明它的使用语法、多参数调用方式以及它在编译层面如何落地为一个 PHPClosure。读完后你将掌握如何在模板中定义并复用箭头函数、invoke的完整调用方式以及它背后模板表达式编译为 Closure的实现原理。基本用法调用一个箭头函数invoke过滤器于Twig 3.19引入见 CHANGELOG 中 3.19.0 条目 Add theinvokefilter。它的作用很直接把一个箭头函数作为过滤器接收者把参数依次传入并执行返回执行结果。官方文档给出的标准示例如下{% set person { first: Bob, last: Smith } %} {% set func p #{p.first} #{p.last} %} {{ func|invoke(person) }} {# outputs Bob Smith #}几个要点值得注意func是模板中定义的一个箭头函数形如p 表达式其中p是参数名右侧是被求值的表达式#{p.first} #{p.last}使用了 Twig 的字符串插值语法等价于 ~ p.first ~ ~ p.last之类的拼接{{ func|invoke(person) }}中invoke的第一个参数person会被作为p传入箭头函数体内整个表达式的值就是输出结果Bob Smith。这种函数值先行定义、后行调用的模式与 模板语言文档 中对运算符的说明一脉相承箭头函数可以存储在变量中供后续复用例如{% set first_name_fn (p) p.first_name %} {{ people|map(first_name_fn)|join(, ) }}而invoke补上了最后一环——对已存为变量的箭头函数进行显式调用。多参数调用箭头函数的参数既可以是单个变量也可以是括号包裹的变量列表invoke支持传入多个参数。当前仓库的集成测试夹具 tests/Fixtures/filters/invoke.test 覆盖了这两种典型场景--TEMPLATE-- {% set func x Hello ~x %} {{ func|invoke(World) }} {% set func2 (x, y) xy %} {{ func2|invoke(3, 2) }}期望输出为Hello World 5可以看出单参数场景下invoke(World)中的World传给x字符串拼接后输出Hello World多参数场景下(x, y) xy通过invoke(3, 2)按位置顺序接收两个参数输出求和结果5。因此invoke的调用形态是{{ callable|invoke(arg1, arg2, ...) }}参数个数需与箭头函数声明的参数列表匹配。源码级实现一个极小的 PHP 静态方法invoke过滤器在核心扩展中注册。在 src/Extension/CoreExtension.php 的过滤器列表中它被归入 iteration and runtime迭代与运行时分组// iteration and runtime new TwigFilter(default, [self::class, default], [node_class DefaultFilter::class]), new TwigFilter(keys, [self::class, keys]), new TwigFilter(invoke, [self::class, invoke]),其实现位于 src/Extension/CoreExtension.php简洁到只有三行/** * Invokes a callable. * * internal */ public static function invoke(\Closure $arrow, ...$arguments): mixed { return $arrow(...$arguments); }从源码结构看有两个关键约束参数类型是\Closureinvoke的第一个参数即过滤器接收者必须是 PHP 的闭包对象。这不是随意选择的类型——它恰好对应 Twig 箭头函数编译后的产物见下一节。如果传入的不是箭头函数类型检查会在运行时失败可变参数转发...$arguments收集invoke之后传入的所有参数再通过$arrow(...$arguments)展开转发给闭包这解释了多参数调用的按位置传递行为。值得对比的是Twig 中大多数过滤器如length、reverse在编译期会内联为直接函数调用而invoke保留了通用的运行时调用形态编译产物形如CoreExtension::invoke($var, 3, 2)由 PHP 在渲染时反射无关地直接执行这也是它能支持任意模板期创建的函数值的原因。编译原理箭头函数如何变成 Closureinvoke之所以要求\Closure类型根源在于箭头函数的编译实现。查看 src/Node/Expression/ArrowFunctionExpression.php 的compile()方法public function compile(Compiler $compiler): void { $compiler -addDebugInfo($this) -raw(function () -subcompile($this-getNode(names)) -raw() use ($context, $macros) { ) ; // 将参数名注入 $context foreach ($this-getNode(names) as $name) { $compiler -raw($context[) -raw($name-getAttribute(name)) -raw(] $__) -raw($name-getAttribute(name)) -raw(__; ) ; } $compiler -raw(return ) -subcompile($this-getNode(expr)) -raw(; }) ; }也就是说模板中的{% set func p #{p.first} #{p.last} %}最终被编译为创建一个function (p) use ($context, $macros) { ... return ...; }的 PHP 闭包。这带来两个推论闭包通过use ($context, $macros)捕获模板上下文因此箭头函数体内可以引用模板中的其他变量和宏即使这些名字不是它的形参{% set %}把该闭包赋给上下文变量funcfunc|invoke(person)时invoke()拿到的正是这个Closure实例——类型约束与编译产物严丝合缝。此外构造函数中ArrowFunctionExpression.php还校验了参数列表必须是单一变量或变量列表否则抛出SyntaxError即箭头函数的参数必须是变量或变量列表。与其他接受箭头函数的过滤器协同invoke并不是孤立特性而是箭头函数生态的组成部分。根据 doc/templates.rst 的说明内置的map、reduce、sort、filter、find等过滤器直接接受箭头函数作为参数例如{{ people|map(p p.first_name)|join(, ) }}箭头函数对函数、宏、方法调用的支持在 Twig 3.15 加入过滤器和测试更早支持存入变量的箭头函数则通过invoke过滤器调用3.19 加入。从使用场景看invoke的典型价值在于定义一次、多处/延迟调用比如根据用户偏好选择不同格式化函数存入变量再统一用{{ formatter|invoke(value) }}执行避免在模板中重复书写函数体。版本与环境要求使用invoke过滤器需要满足以下前提以当前仓库实际内容为准Twig 版本≥ 3.19由文档中的.. versionadded:: 3.19与 CHANGELOG 的 3.19.02025-01-28记录共同确认PHP 版本≥ 8.1见 composer.json 中php: 8.1.0的声明。箭头函数本身依赖 PHP 闭包语法而本仓库已将最低 PHP 要求提升至 8.1。小结invoke过滤器用极简的接口{{ func|invoke(...) }}打通了模板期定义的箭头函数与显式调用之间的缺口官方文档示例展示了单参数、基于字符串插值的格式化调用仓库测试 tests/Fixtures/filters/invoke.test 补充了多参数位置传参的行为而源码层面CoreExtension::invoke() 仅是一次\Closure展开转发其类型约束恰好与 ArrowFunctionExpression 编译产出的function (...) use ($context, $macros) {...}闭包相对应。理解这条模板箭头函数 → PHP Closure → invoke 转发的链路就能准确判断它何时可用、如何组合使用。赞分享后端【免费下载链接】TwigTwig, the flexible, fast, and secure template language for PHP项目地址https://gitcode.com/gh_mirrors/tw/Twig点击查看免费下载相关推荐Twig filter 滤镜深度解析用箭头函数过滤序列与映射Twig filter 滤镜深度解析用箭头函数过滤序列与映射 本文基于 Twig 官方文档 doc/filters/filter.rst https://li后端Twig find 过滤器完全指南用箭头函数在序列与映射中定位首个匹配元素Twig find 过滤器完全指南用箭头函数在序列与映射中定位首个匹配元素 find 是 Twig 3.11 引入的数组辅助过滤器它与 filter 、 m后端Twig column 过滤器详解从一行模板语法到 PHP array_column 与沙箱安全检查Twig column 过滤器详解从一行模板语法到 PHP array_column 与沙箱安全检查 column 是 Twig 核心过滤器之一用于从一个对后端上一篇集群监控高级功能ARM-exporter与MetalLB监控模块完整启用指南下一篇Buck研究论文学术界对构建系统的分析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

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

较早相关资讯

最新相关资讯

utopia 本体分层决策实践:为什么“本体是文档陈述之上的视图“成为抽取与知识组织的核心契约 2026/9/25 4:51:19

utopia 本体分层决策实践:为什么“本体是文档陈述之上的视图“成为抽取与知识组织的核心契约

后端前端人工智能RAG知识图谱知识管理搜索引擎 【免费下载链接】utopia Worlds first open-source enterprise world model. 项目地址: https://gitcode.com/gh_mirrors/ont/utopia 点击查看 免费下载 导读:本文基于 utopia 项目决策记录 0044-the-onto…

阅读更多 →
HTML PPT Studio 演讲者模式指南:用逐字稿与磁吸卡片打造不卡壳的技术分享 2026/9/25 4:51:19

HTML PPT Studio 演讲者模式指南:用逐字稿与磁吸卡片打造不卡壳的技术分享

AI 技能/插件前端 【免费下载链接】html-ppt-skill HTML PPT Studio — AgentSkill with 24 themes, 31 layouts, 20 animations for building professional HTML presentations 项目地址: https://gitcode.com/gh_mirrors/ht/html-ppt-skill 点击查看 免费下载 这…

阅读更多 →
ESP32上运行WebAssembly的实战指南:WAMR嵌入式适配与性能优化 2026/9/25 4:51:06

ESP32上运行WebAssembly的实战指南:WAMR嵌入式适配与性能优化

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

阅读更多 →
基于STM32的分布式消防预警控制系统设计与实现 2026/9/25 4:51:06

基于STM32的分布式消防预警控制系统设计与实现

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

阅读更多 →
AI视频+配乐全自动流水线:松耦合架构与工程化实践 2026/9/25 4:51:00

AI视频+配乐全自动流水线:松耦合架构与工程化实践

1. 这条流水线到底卡在哪:先看清AI视频配乐全自动的真实边界2026年开年到现在,我身边做短视频的朋友几乎都在问同一个问题:AI视频生成加上AI配乐,能不能从一句文案开始,中间不碰鼠标,直接吐出一条带背景音乐…

阅读更多 →
华为昇腾Atlas 300V 24G推理卡部署YOLOv5/v8完全指南 2026/9/25 4:51:00

华为昇腾Atlas 300V 24G推理卡部署YOLOv5/v8完全指南

搞推理加速这几年,我手里过过不少卡,但头一回拿到华为昇腾Atlas 300V 24G这块卡的时候,还是被周围人问过同一个问题:这玩意儿到底是不是运算加速卡?它能干嘛?能不能拿来跑YOLO?带着这些疑问&…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

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

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