模板引擎概述 Template Overview

模板引擎概述 Template Overview

DouPHP 前台与后台的模板,统一由自研的编译式模板引擎 DouView 1.0 渲染,实现位于 core/web/template。它是「先编译成 PHP、再 include 执行」的两段式引擎:模板源文件只在需要时被编译一次,编译产物落盘缓存,后续请求直接执行缓存文件。

本手册是 DouView 的全面使用手册:逐一覆盖所有标签、所有变量、所有修饰器、表达式语法、预过滤器、安全约束,并延伸到主题制作语法。每个标签独立成篇,给出完整语法、全部参数与默认值、编译期行为、边界与安全限制、真实模板示例。

一、编译管线

模板从源文件到最终输出,经历四个阶段:

模板源 → Prefilter(预过滤) → Lexer(词法) → Parser(语法/AST) → CodeGenerator(生成 PHP) → 编译产物
                                                                                          ↓
                                                              include 编译产物 + RenderContext 运行期渲染
  • Prefilter 预过滤:编译前对源文本做变换,前台与后台各一套(详见「预过滤器 Prefilter」篇)。
  • Lexer 词法:按定界符把源切成「文本块」与「标签块」Token,{literal} 区、注释等在词法层特殊处理。
  • Parser 语法:把 Token 组装成 AST(抽象语法树),块标签({if}/{foreach}/{list}/{category}/{strip})在此入栈配对。
  • CodeGenerator 代码生成:遍历 AST,各 NodeType 由对应标签编译器 emit 成 PHP 片段,最后 assemble() 统一拼装(含 {strip} 空白折叠)。

二、运行期载体 RenderContext($ctx)

编译产物在运行期只依赖一个对象 $ctx(RenderContext 实例)。模板变量、循环元数据、修饰器分发、子模板包含全部经它访问:

  • $ctx->vars:模板变量作用域(与引擎 assign 的数据引用绑定)。
  • $ctx->loops / $ctx->loopVarmap:循环运行期数据与 @property 支持。
  • $ctx->filter(名, 值, 参数...):修饰器运行期分发入口。
  • $ctx->set():{assign} 与 {include assign=...} 的写入入口。
  • $ctx->includeTemplate():子模板包含(子作用域隔离)。

业务侧一般不直接接触 DouView,而是通过 \Dou\Core\Facade\View 门面调用(view('xxx.dwt', $data))。

三、18 种节点类型(NodeType)

Parser 产出的 AST 节点共 18 种,覆盖引擎全部语法能力:

节点类型 常量 对应语法
文档根 DOCUMENT 顶层容器
原始文本 TEXT 标签之外的 HTML/文本
变量输出 ECHO_ {$x}、{$x|mod}
变量三元 TERNARY {$a ? x : y}
路由链接 URL {url ...}
模板包含 INCLUDE_ {include ...}
变量赋值 ASSIGN {assign ...}
条件判断 IF_ {if}/{elseif}/{else}
循环遍历 FOREACH_ {foreach}/{foreachelse}
模块列表 LIST_ {list}/{listelse}
分类树 CATEGORY {category}/{categoryelse}
空白压缩 STRIP {strip}...{/strip}
原样输出 LITERAL {literal}...{/literal}
模板注释 COMMENT {* ... *}
PHP 标签 PHP {php}(编译期拒绝)
定界符 DELIM {ldelim} / {rdelim}
跳出循环 BREAK_ {break}
继续循环 CONTINUE_ {continue}

四、引擎配置项

DouView 实例的公开配置(core/web/template/DouView.php):

配置项 默认值 说明
template_dir templates 模板根目录(可为数组,多目录回退)
compile_dir templates_c 编译产物目录
force_compile false 为真时每次请求强制重编
compile_check true 为真时比对源文件 mtime 决定是否重编
leftDelimiter { 左定界符
rightDelimiter } 右定界符
escapeHtml false 全局自动 HTML 转义开关
VERSION 1.0 产品版本($douview.version)
COMPILE_REVISION 11 编译修订号,仅作缓存失效判据

五、文件扩展名白名单与命名约定

模板资源名({include} 的 file、view() 的第一个参数)只允许以下扩展名:

.tpl   .htm   .html   .dwt

DouPHP 的惯例分工:

  • .dwt:前台主题页面模板(如 index.dwt、article.dwt)。
  • .htm:后台页面模板。
  • .tpl:公共片段(如 inc/header.tpl、inc/footer.tpl),用 {include} 引入。

资源名禁止包含 ..、绝对路径或盘符(resolveTemplatePath 会拒绝并做越界校验),详见「模板包含 Include」与「自动转义与安全」篇。

六、阅读指引

  • 变量与表达式:见「变量输出 Variable Output」「变量访问语法 Variable Access」「表达式运算 Expressions」。
  • 控制结构:见「条件判断 If」「循环遍历 Foreach」「模块列表 List」「分类树 Category」。
  • 核心标签:见「路由链接 Url」(最常用、最详尽)「模板包含 Include」等。
  • 修饰器与内建变量:见「变量修饰器 Modifiers」「系统变量 Douview」。
  • 主题制作:见 G 组「前台通用变量」「主题目录结构」「主题数据装配 Portal」等。
添加日期: