⚡️ 簡單快速的 PHP 模板引擎。
功能特性
- 簡單、輕量且快速。
- 無學習成本
- 僅僅簡單處理並轉換為原生PHP語法
- 相容PHP原生語法使用
- 更加簡單的輸出語法。 例如:
{{= $var }}
{{ $var }}
{{ echo $var }}
- 支援所有控制語法。 例如
if,elseif,else;foreach;for;switch
- 支援鏈式訪問陣列值。 例如:
{{ $arr.0 }}
{{ $map.name }}
{{ $map.user.name }}
- 更加安全,預設會自動透過
htmlspecialchars
將輸出結果進行處理- 除非設定了禁用或者手動使用
raw
過濾器
- 除非設定了禁用或者手動使用
- 支援使用PHP內建函式作為過濾器。 例如:
{{ $var | ucfirst }}
- 支援新增自定義過濾器
- 預設內建過濾器:
upper
lower
nl
- 預設內建過濾器:
- 支援新增自定義指令,提供自定義功能
- 支援模板中新增註釋。 例如:
{{# comments ... #}}
安裝
- 需要 PHP 8.0+
composer
composer require phppkg/easytpl
快速開始
use PhpPkg\EasyTpl\EasyTemplate;
$tplCode = <<<'CODE'
My name is {{ $name | strtoupper }},
My develop tags:
{{ foreach($tags as $tag) }}
- {{ $tag }}
{{ endforeach }}
CODE;
$t = new EasyTemplate();
$str = $t->renderString($tplCode, [
'name' => 'inhere',
'tags' => ['php', 'go', 'java'],
]);
echo $str;
渲染輸出:
My name is INHERE,
My develop tags:
- php
- go
- java
更多使用說明
語法跟PHP原生模板一樣的,加入的特殊語法只是為了讓使用更加方便。
EasyTemplate
預設開啟輸出過濾,可用於渲染檢視模板TextTemplate
則是關閉了輸出過濾,主要用於文字處理,程式碼生成等
配置設定
use PhpPkg\EasyTpl\EasyTemplate;
$t = EasyTemplate::new([
'tplDir' => 'path/to/templates',
'allowExt' => ['.php', '.tpl'],
]);
// do something ...
更多設定:
/** @var PhpPkg\EasyTpl\EasyTemplate $t */
$t->disableEchoFilter();
$t->addFilter($name, $filterFn);
$t->addFilters([]);
$t->addDirective($name, $handler);
輸出變數值
下面的語句一樣,都可以用於列印輸出變數值
{{ $name }}
{{= $name }}
{{ echo $name }}
更多:
{{ $name ?: 'inhere' }}
{{ $age > 20 ? '20+' : '<= 20' }}
預設會自動透過
htmlspecialchars
將輸出結果進行處理,除非設定了禁用或者手動使用raw
過濾器
- 設定禁用輸出過濾
$t->disableEchoFilter()
- 模板中禁用輸出過濾
{{ $name | raw }}
快速訪問陣列值
可以使用 .
來快速訪問陣列值。原來的寫法也是可用的,簡潔寫法也會自動轉換為原生寫法。
$arr = [
'val0',
'subKey' => 'val1',
];
在模板中使用:
first value is: {{ $arr.0 }} // val0
'subKey' value is: {{ $arr.subKey }} // val1
If 語句塊
if
語句:
{{ if ($name !== '') }}
hi, my name is {{ $name }}
{{ endif }}
if else
語句:
hi, my name is {{ $name }}
age is {{ $age }}, and
{{ if ($age >= 20) }}
age >= 20.
{{ else }}
age < 20.
{{ endif }}
if...elseif...else
語句:
hi, my name is {{ $name }}
age is {{ $age }}, and
{{ if ($age >= 50) }}
age >= 50.
{{ elseif ($age >= 20) }}
age >= 20.
{{ else }}
age < 20.
{{ endif }}
For/Foreach 語句塊
foreach
:
tags:
{{ foreach($tags as $tag) }}
- {{ $tag }}
{{ endforeach }}
with keys:
tags:
{{ foreach($tags as $index => $tag) }}
{{ $index }}. {{ $tag }}
{{ endforeach }}
模板中新增註釋
以 {{#
和 #}}
包裹的內容將會當做註釋忽略。
{{# comments ... #}}{{ $name }} // inhere
multi lines:
{{#
this
comments
block
#}}{{ $name }} // inhere
使用過濾器
預設內建過濾器:
upper
- 等同於strtoupper
lower
- 等同於strtolower
nl
- 追加換行符\n
過濾器使用示例
您可以在任何模板中使用過濾器。
基本使用:
{{ 'inhere' | ucfirst }} // Inhere
{{ 'inhere' | upper }} // INHERE
鏈式使用:
{{ 'inhere' | ucfirst | substr:0,2 }} // In
{{ '1999-12-31' | date:'Y/m/d' }} // 1999/12/31
傳遞非靜態值:
{{ $name | ucfirst | substr:0,1 }}
{{ $user['name'] | ucfirst | substr:0,1 }}
{{ $userObj->name | ucfirst | substr:0,1 }}
{{ $userObj->getName() | ucfirst | substr:0,1 }}
將變數作為過濾器引數傳遞:
{{
$suffix = '¥';
}}
{{ '12.75' | add_suffix:$suffix }} // 12.75¥
自定義過濾器
use PhpPkg\EasyTpl\EasyTemplate;
$tpl = EasyTemplate::new();
// use php built function
$tpl->addFilter('upper', 'strtoupper');
// 一次新增多個
$tpl->addFilters([
'last3chars' => function (string $str): string {
return substr($str, -3);
},
]);
在模板中使用:
{{
$name = 'inhere';
}}
{{ $name | upper }} // INHERE
{{ $name | last3chars }} // ere
{{ $name | last3chars | upper }} // ERE
自定義指令
您可以使用指令實現一些特殊的邏輯。
$tpl = EasyTemplate::new();
$tpl->addDirective(
'include',
function (string $body, string $name) {
/** will call {@see EasyTemplate::include()} */
return '$this->' . $name . $body;
}
);
在模板中使用:
{{ include('part/header.tpl', ['title' => 'My world']) }}
Github: github.com/phppkg/easytpl
本作品採用《CC 協議》,轉載必須註明作者和本文連結
GIthub github.com/inhere