模版
变量输出
数据变量可以通过定界符(双大括号)包裹来输出显示。
如:
|
编译后:
|
数据变量由视图View
的相关方法传递设置。
定界符可以通过配置项
text_delimiter_sign
自定义。
转义
模版引擎默认开启自动转义,输出的内容使用htmlspecialchars
函数处理,这样可以有效的防止xss
攻击。
不过在有些使用场景下(如CMS
类应用,内容通常是第一方生产的)并不需要转义,这种情况下可以通过设置配置'auto_escape_text' => false
来关闭自动转义。
除了设置自动转义外,用户也可以手动强制输出转义或不转义。
在右定界符后使用:
符号强制输出转义
|
在右定界符后使用!
符号强制输出不转义
|
编译后:
|
为了简化示例,后面的示例设为默认不转义,省略htmlspecialchars
。
数组
使用.
符号
|
另一种数组写法,使用[]
|
编译后:
|
对象
调用对象方法或属性使用->
符号
|
编译后:
|
不输出
在右定界符后使用%
符号表示不调用echo
输出内容,通常可以使用这种方法做赋值等操作。
|
编译后:
|
注释
在右定界符前使用#
符号可注释单行内容,被注释内容编译后会被去掉。
|
注释多行内容使用
note
标签
过滤器
过滤器用来处理输出。
在模版可以使用链式语法符号.
连接过滤器名调用过滤器
|
另外也可以使用传统写法调用过滤器
|
第一种写法相当于.
前面内容作为过滤器第一个参数,语法更符合人的阅读习惯。
编译后:
|
内置过滤器
模版引擎内置了大量过滤器(默认配置
),这些过滤器通常编译后会被替换成PHP原生函数。
如内置字符串分割过滤器split
定义如下例,使用PHP函数explode
实现,并且其使用$
加数字调整参数位置。
|
调用示例:
|
编译后:
|
另外如果有多个可选参数时,可以用...
符号省略,如:
|
调用示例:
|
编译后:
|
用户也可以通过配置filters
增加或替换内置过滤器,如下例增加了一个字符串反转过滤器strrev
。
|
既然内置过滤器基本都是原生PHP函数的马甲为什么不直接用原生PHP函数?
- 安全:只允许使用过滤器,可以防止设计人员使用有些危险的PHP函数如
eavl
exec
等。- 易用:内置过滤器借鉴了javascript语法及其流行框架和其它语言的流行模版引擎,使其更适合设计人员使用,另外由于历史原因,一些原生PHP函数的命名和参数顺序也有些混乱,使用内置过滤器可以调整这些问题。
- 易读:过滤器使用链式调用语法,阅读起来更加自然顺畅。
自定义过滤器
除了使用内置过滤器,用户也可以在业务代码中定义自定义过滤器供模版使用。
定义自定义过滤器使用View::filter
方法,如:
|
在模版中调用
|
注意自定义过滤器命名不要与内置过滤器冲突,同名内置过滤器调用优先级大于自定义过滤器
魔术变量
模版内保留了少量魔术变量(默认配置
),使用$
符号标记语句调用。
此类变量使用方式与普通变量一样,但并不是真正的变量,最终会被编译成函数或方法调用。
调用示例:
|
编译后:
|
函数 容器 静态方法
在模版语法中可以用@
符号标记语句调用PHP函数、静态类方法、容器实例方法(依赖框架实现)
函数
默认不允许调用任何函数,用户可通过配置项allow_php_functions
来设置允许调用的函数。
'allow_php_functions' => true
表示允许调用所有可用函数。
'allow_php_functions' => ['a', 'b', 'c', ...]
表示只允许调用配置数组内的函数。
模版调用规则@函数名()
|
静态方法
要调用静态类方法,用户必须设置配置项allow_static_classes
来设置允许调用的静态类。
|
模版调用规则@类别名.方法名()
|
容器方法
默认不允许调用任何容器,用户可通过配置项allow_container_providers
来设置允许调用的容器。
'allow_container_providers' => true
表示允许调用所有可用容器。
'allow_container_providers' => ['a', 'b', 'c', ...]
表示只允许调用配置数组内的容器。
模版调用规则@容器名->方法名()
|
容器实例的调用依赖框架实现,如用户需自定义容器实例调用(如单独使用模版引擎),可设置配置项
view_container_macro
实现。
运算符
数学运算符 +
-
*
/
%
比较运算符 ==
===
!=
!==
>
>=
<
<=
逻辑运算符 ||
&&
!
三元运算符 a ? b : c
a ?: b
a ?? b
赋值 =
括号 (a + b) * c
数组 [1, 2 ,3]
{"a": 1, "b": 2, "c": 3}
控制结构
控制结构以标签内使用前缀符@
开头的属性标识,支持if
elseif
else
each
for
while
等
判断
|
编译后:
|
联合使用if
elseif
else
时,其标签之间不能有其它非空内容,否则会出现异常编译失败。
循环
each
语句
使用key:val in array
的格式遍历数组的键值
|
编译后:
|
也可以使用忽略键值的语法
忽略键
|
忽略值
|
忽略键值(此情况下默认可以使用key
和val
来获取键值)
|
for
语句
|
编译后:
|
while
语句
|
编译后:
|
变量赋值
模版支持在标签内使用以$
开头的属性语法赋值变量
|
编译后:
|
双引号字符串
模版支持在标签内以*
开头的属性的值使用原生的PHP双引号字符串语法,在字符串中嵌入多个变量时更加便捷。
|
编译后:
|
相近的插值语法写法:
|
编译后:
|
模版引用
使用模版引用标签include
在当前模版中引用其它模版
|
include
标签最终会被编译成PHP原生include
语句来引用加载其它模版,所以在编译当前模版时是不读取被引用模版内容的,也不会合并到当前模版一起编译
动态引用
使用:name
属性动态引用模版,因为其传递是一个变量,而name
传递是一个字符串。
标签内以
:
开头的属性为动态属性参数,其值使用模版语法解析。
|
在include
标签中也可以使用判断循环语句
如例:循环views
并判断模版是否存在,存在则引用模版。
|
除了include
标签,下面的insert
和extends
标签不支持动态调用,因为它们是先合并后再编译。
模版插入
使用模版插入insert
标签可以将要插入的模版读取合并到当前模版,然后再编译。
当前模版
|
要插入的模版title
|
合并为
|
insert
标签类似于而又不同于include
标签,前者会合并后编译,后者会分别独立编译。
插槽
使用插槽标签slot
可以将insert
标签包裹的内容注入到要插入的模版内,如
当前模版
|
要插入的模版title
|
合并为
|
slot
默认值
可以在要插入的模版中使用slot
标签包裹设置默认内容,如果当前模版中insert
标签没有包裹内容则使用默认内容,有则覆盖默认内容。如
当前模版
|
要插入的模版title
|
合并为
|
多个slot
一个insert
标签内可以指定多个slot
,使用方法为用多个slot
标签包裹内容。
当前模版
|
要插入的模版title
|
合并为
|
插入块
insert
不仅支持插入整个模版文件内容,也支持插入其中的一个模版块block
,语法为使用.
连接模版名与block
名。
当前模版
|
要插入的模版title
|
合并为
|
多重插入
模版支持多重继承,如a
中插入b
,b
中插入c
。
模版a
|
模版b
|
模版c
|
合并为
|
多重插入不能大于9层,防止相互插入死循环。
模版继承
使用模版继承extends
标签可以将当前模版block
合并到其继承的父模版中。
当前模版
|
父模版layout
|
合并为:
|
子模版中定义的block
替换父模版中同名的block
,子模版中未定义的block
默认使用父模版中的block
。
子模版
block
中使用<parent/>
标签可把父模版同名block
的内容插入到其中。
多重继承
模版支持多重继承,如a
继承b
,b
继承c
,c
继承d
,a b c
3个模版会合并block
,同名block
覆盖,优先级为a > b > c
。
d
为基础layout
父模版,a b c
合并的block
与d
合并成最终模版。
模版a
|
模版b
|
模版c
|
模版d
|
合并为:
|
多重继承不能大于9层,防止相互继承死循环。
插入与继承
模版插入insert
可以与模版继承extends
联合使用。
当前模版
|
模版a
|
模版b
|
模版c
|
模版layout
|
合并为:
|
extends
继承标签和insert
插入标签同时使用时,insert
标签先于extends
标签合并。注意block
不要出现嵌套使用。
空标签
有些情况下,模版语法不需要嵌入到实体html
标签中时,可使用空标签void
,编译后空标签会被去除只保留逻辑部分。
|
编译后:
|
注释标签
使用note
标签注释模版,被注释部分在模版编译后去除。
|
原样输出
使用raw
标签可以防止模板标签被解析,其包含内容会被原样输出。
通常在同时使用前后端模版时,可使用此标签防止前端模板被解析。
|
note
extends
insert
等标签优先级大于raw
标签,所以仍会被解析编译。
Heredoc
使用heredoc
标签可以调用php
原生heredoc
语法,在输出大段包含变量的文本时更加便捷,也可以设置配置heredoc_tag => false
禁止heredoc
标签使用。
|
编译后:
|
另外也可以使用name
指定heredoc
标识符来替换默认的标识符EOT
如:
|
编译后:
|
heredoc
标签中无法使用模版语法。
原生PHP
在需要使用原生PHP代码时可以php
标签来包裹PHP代码,但是一般不建议这么做,可以设置配置php_tag => false
禁止php
标签使用。
|
模版中不允许存在<?php ?>
这类原生PHP语法,php
标签中也无法使用模版语法。
附录
默认配置
|
内置过滤器
|