介绍
think-template是一个基于PHP
5.6+实现的编译型模板引擎,主要特性包括:
- 支持XML标签库和普通标签的混合定义;
- 支持直接使用PHP代码书写;
- 支持文件包含;
- 支持多级标签嵌套;
- 支持布局模板功能;
- 一次编译多次运行,编译和运行效率非常高;
- 模板文件和布局模板更新,自动更新模板缓存;
- 系统变量无需赋值直接输出;
- 支持多维数组的快速输出;
- 支持模板变量的默认值;
- 支持页面代码去除Html空白;
- 支持变量组合调节器和格式化功能;
- 允许定义模板禁用函数和禁用PHP语法;
- 通过标签库方式扩展;
功能特性和ThinkPHP
5.1内置的模板引擎基本一致,适用于没有使用
ThinkPHP框架但希望找一个高性能的编译型模板引擎的情况。
安装
通过
composer直接安装即可
composer require topthink/think-template
用法示例
在根目录下创建
index.php入口文件测试:
<?php
namespace think;
require __DIR__.'/vendor/autoload.php';
$config = [
'view_path' => './template/',
'cache_path' => './runtime/',
'view_suffix' => 'html',
];
$template = new Template($config);
$template->assign('name','thinkphp');
$template->fetch('index');
更多的模板引擎参数可以参考
fetch方法必须指定模板文件名(不需要后缀和路径),上面的代码对应的模板文件位于
./template/index.html。
然后就可以在模板文件中输出模板变量
Hello,{$name}!
执行入口文件应该会看到输出
Hello,thinkphp!
变量输出的定界符支持自定义,例如:
$config = [
'view_path' => './template/',
'cache_path' => './runtime/',
'view_suffix' => 'html',
'tpl_begin' => '{',
'tpl_end' > '}',
];
如果要批量给模板变量赋值,可以用
$template->assign([
'name' => 'thinkphp',
'foo' => 'bar',
]);
支持直接渲染内容输出,不需要定义模板文件
$template = new Template($config);
$template->assign('name','thinkphp');
$content = 'Hello,{$name}!';
$template->display($content);
所有的模板变量默认输出都会自动进行转义处理,以避免
XSS攻击的可能性。如果你不需要进行任何的转义,可以使用
|raw保持原样不做转义输出(例如输出HTML内容的时候需要)。
Hello,{$name|raw}!
数组和对象输出
如果需要在模板中输出数组,可以使用
{$item.name}
{$item['name']}
要输出对象的属性,可以使用
{$object->name}
也可以直接调用对象的常量或者方法
常量:{$object::CONST_NAME}
方法:{$object->method()}
支持函数
{$name|strtolower|strip_tags}
系统变量输出
如果需要输出系统变量,可以不需要赋值给模板变量然后输出,可以直接在模板文件中输出系统变量,例如:
{$Think.server.script_name}
{$Think.session.user_id}
{$Think.get.page}
{$Think.cookie.name}
支持输出
$_SERVER、
$_ENV、
$_POST、
$_GET、
$_REQUEST、
$_SESSION和
$_COOKIE变量。
如果系统常量直接使用
{$Think.PHP_VERSION}
运算符
我们可以对模板输出使用运算符,包括如下支持。
| 运算符 |
使用示例 |
+ |
{$a+$b} |
- |
{$a-$b} |
* |
{$a*$b} |
/ |
{$a/$b} |
% |
{$a%$b} |
++ |
{$a++} 或 {++$a} |
-- |
{$a--} 或 {--$a} |
| 综合运算 |
{$a+$b*10+$c} |
在使用运算符的时候,不再支持前面提到的函数过滤用法,例如:
{$user.score+10}
{$user['score']+10}
{$user['score']*$user['level']}
{$user['score']|myFun*10}
{$user['score']+myFun($user['level'])}
三元运算
模板可以支持三元运算符,例如:
{$status? '正常' : '错误'}
{$info['status']? $info['msg'] : $info['error']}
{$info.status? $info.msg : $info.error }
还支持如下的写法:
{$name ?? '默认值'}
原样输出
可以使用
literal标签来防止模板标签被解析,例如:
{literal}
Hello,{$name}!
{/literal}
上面的
{$name}标签被
literal标签包含,因此并不会被模板引擎解析,而是保持原样输出。
literal标签还可以用于页面的JS代码外层,确保JS代码中的某些用法和模板引擎不产生混淆。
总之,所有可能和内置模板引擎的解析规则冲突的地方都可以使用
literal标签处理。
模板注释
模板支持注释功能,该注释文字在最终页面不会显示,仅供模板制作人员参考和识别。
单行注释
格式:
{ } 或 {
例如:
{
注意{和注释标记之间不能有空格。
多行注释
支持多行注释,例如:
{ }
模板注释支持多行,模板注释在生成编译缓存文件后会自动删除,这一点和Html的注释不同。