
后端【免费下载链接】TwigTwig, the flexible, fast, and secure template language for PHP项目地址https://gitcode.com/gh_mirrors/tw/Twig点击查看免费下载导读block函数是 Twig 模板引擎中与模板继承extends、use配套的运行时函数用于在一个模板中多次渲染同一个块或者从另一个模板文件中取出并显示指定块。本文以 doc/functions/block.rst 为骨架结合本仓库的源码实现与集成测试完整讲解block函数的两种调用形态、defined测试的配合用法、参数细节及其在编译期的底层工作原理。读完后你将能准确使用block函数处理页头页尾复用、跨模板组件抽取、可选块探测等常见场景。基本用法在模板继承中重复渲染块当一个模板使用了继承extends并且你希望多次渲染同一个块时直接使用block函数即可。与{% block %}标签用于定义块不同block(name)用于在模板中的任意位置引用并输出某个块的内容title{% block title %}{% endblock %}/title h1{{ block(title) }}/h1 {% block body %}{% endblock %}在上面的例子中{% block title %}{% endblock %}定义了title块随后{{ block(title) }}在h1中再次输出了同一个块的内容。这种先定义、后引用的模式非常适合在布局模板中把某个区域如标题、元信息、页脚版权文案同时输出到多个位置。注意block函数的输出是运行时才确定的——它会去解析当前模板含其父模板链中该名称对应的最终块定义因此即使块内容在子模板中被覆盖block(title)取到的也是覆盖后的结果。仓库的集成测试 tests/Fixtures/functions/block.test 验证了这一点子模板覆盖bar块后父模板中的{{ block(bar) }}、{{ block(namebar) }}以及原样{% block bar %}{% endblock %}三处输出全部命中子模板的BAR最终渲染结果为BARBARBAR。跨模板渲染通过 template 参数指定来源模板block函数还可以接受第二个参数template用于从另一个模板文件中显示一个块而不依赖当前模板的继承关系{{ block(title, common_blocks.html.twig) }}该参数既可以是模板路径的字符串也可以是一个已经加载好的Twig\TemplateWrapper对象例如通过$twig-load()得到的结果。测试 tests/Fixtures/functions/block_with_template.test 分别验证了以下写法都能正确渲染出included.twig中的FOO{{ block(foo, included.twig) }} {{ block(foo, included_loaded) }} {% set output block(foo, included.twig) %} {{ output }} {% set output block(namefoo, templateincluded.twig) %} {{ output }} {% set output block(templateincluded.twig, namefoo) %} {{ output }}同时该测试也证明了一个重要行为当指定的模板中不存在该块时块会回退到当前模板中同名块的定义——测试末尾当前模板定义的{% block foo %}NOT FOO{% endblock %}正是为此设计此时block(foo, included.twig)会输出NOT FOO。这提醒我们跨模板取块时如果来源模板里没有同名块并不会报错而是静默回退需要在业务上留意是否符合预期。block函数的返回值也可以被捕获并继续加工例如存入变量后再输出如上例所示这与大多数 Twig 函数一样可以在表达式中直接使用。与 defined 测试结合探测块是否存在使用defined测试可以在渲染前检查块是否存在于当前模板的上下文中{% if block(footer) is defined %} ... {% endif %}同样适用于带template参数的跨模板场景{% if block(footer, common_blocks.html.twig) is defined %} ... {% endif %}这种写法常用于可选区块的兜底逻辑例如仅当布局模板或公共模板确实定义了footer块时才输出相关容器 DOM避免产生空标签或占位内容。defined测试本身是 Twig 内置测试见 doc/tests/defined.rst与block函数组合是官方文档推荐的块存在性探测标准姿势。参数说明参数类型必填说明namestring是要渲染的块名称templatestring/TemplateWrapper否指定在哪个模板中查找该块省略时在当前模板含父模板链中查找两个参数均支持命名参数写法block(namebar)、block(namefoo, templateincluded.twig)且顺序可任意调整如上文测试示例所示。源码级原理block 函数在 Twig 中如何工作block在 Twig 中并非普通运行时函数而是通过parser_callable在编译期被解析为专门的表达式节点这在 src/Extension/CoreExtension.php 的注册处可以看到new TwigFunction(block, null, [parser_callable [self::class, parseBlockFunction]]),对应解析方法 parseBlockFunction 会先构造一个假函数并用CallableArgumentsExtractor抽取并校验参数这也是命名参数、缺参报错等行为得以支持的原因最终生成一个BlockReferenceExpression节点public static function parseBlockFunction(Parser $parser, Node $fakeNode, $args, int $line): AbstractExpression { $fakeFunction new TwigFunction(block, static fn ($name, $template null) null); $args (new CallableArgumentsExtractor($fakeNode, $fakeFunction))-extractArguments($args); return new BlockReferenceExpression($args[0], $args[1] ?? null, $line); }编译阶段BlockReferenceNode::compileBlockReferenceExpression的节点形态会把调用编译为对模板实例yieldBlock()的委托yield from $this-unwrap()-yieldBlock(%s, $context, $blocks);最终由 Template::displayBlock /yieldBlock()真正执行块的渲染逻辑——它会根据传入的$templateContext即template参数对应的模板来决定从哪个模板取块找不到时回退到当前模板这与上文测试展示的行为完全吻合。从代码结构看block函数在编译期被内联为块调用指令因此它享受与{% block %}相同的模板缓存机制不存在额外的运行时函数查找开销。与 extends、parent 的关系与使用边界block函数与模板继承体系密切相关官方文档将其与以下两个语法点并列extends 标签用于声明当前模板继承某个父模板是block函数当前模板上下文成立的前提。未使用extends/use的模板中block()只能引用本模板自有的块。parent 函数用于在子模板的块内部渲染父模板同名块的内容解决的是块内叠加父级内容的问题而block()解决的是把某个块在任意位置重复渲染 / 跨模板取用的问题二者分工不同。仓库中还有 tests/Fixtures/functions/block_with_template_parent.test验证template参数结合父模板继承链时的行为以及 block_without_name.test、block_without_parent.test分别覆盖缺省name参数报错、在无继承上下文中的使用边界等测试可作为深入理解边界行为的参考。小结block函数是 Twig 继承体系中被低估却非常实用的能力{{ block(name) }}实现块内容的重复渲染{{ block(name, template) }}实现跨模板块取用配合is defined测试可实现优雅的可选块探测而其参数校验与编译期内联特性parseBlockFunction→BlockReferenceExpression→yieldBlock保证了与{% block %}标签一致的渲染语义和性能表现。当你在布局模板中需要一处定义、多处输出或想在当前模板内复用其他模板的既有区块时block函数就是最直接的工具。赞分享后端【免费下载链接】TwigTwig, the flexible, fast, and secure template language for PHP项目地址https://gitcode.com/gh_mirrors/tw/Twig点击查看免费下载相关推荐Hugo 模板指南深入理解 block 模板函数——定义即执行的模板继承机制Hugo 模板指南深入理解 block 模板函数——定义即执行的模板继承机制 本文围绕 Hugo 文档站中的 block 函数文档展开讲解 Go 模板中 {开发工具前端CLITwig source 函数完全指南不渲染地读取模板与资源原始内容Twig source 函数完全指南不渲染地读取模板与资源原始内容 source 是 Twig 模板语言本项目 Twig https://link.gitc后端RxJS 官方文档的 API 模板体系dgeni 模板继承与 docType 渲染全解析RxJS 官方文档的 API 模板体系dgeni 模板继承与 docType 渲染全解析 导读 本文以 templates/README.md https:/前端上一篇BiliBiliToolPro版本兼容性指南升级前必须了解的7个关键事项下一篇Klavis ClickUp MCP Server让 AI Agent 通过 MCP 协议管理 ClickUp 任务与项目工作流创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考