# Latte:PHP的令人驚嘆的模板引擎
Latte是PHP的模板引擎,它簡化了您的工作,并確保輸出被保護免受漏洞,例如XSS。
Latte是快速的:它將模板編譯成平凡的優化PHP代碼。
Latte是安全的:它是第一個引入內容感知轉義的PHP引擎。
Latte語法:它有直觀的語法,并幫助您輕松地構建更好的網站。
雖然PHP最初是一種模板語言,但它不是特別適合編寫模板。 讓我們來看一個PHP模板的例子,它將一個數組$ items打印成一個列表:
~~~
<?php if ($items): ?>
<?php $counter = 1 ?>
<ul>
<?php foreach ($items as $item): ?>
<li id="item-<?php echo $counter++ ?>"><?php
echo htmlSpecialChars(mb_convert_case($item, MB_CASE_TITLE)) ?>
</li>
<?php endforeach ?>
</ul>
<?php endif?>
~~~
代碼相當混亂。 此外,我們不能忘記調用htmlSpecialChars函數。 這就是為什么有這么多不同的模板引擎PHP。 最好的模板引擎之一是Nette Framework的一部分,它被稱為Latte。 你會愛上它!
與上面相同的模板可以很容易地寫在Latte:
~~~
<ul n:if="$items">
{foreach $items as $item}
<li id="item-{$iterator->counter}">{$item|capitalize}</li>
{/foreach}
</ul>
~~~
正如你可以看到有兩種類型的宏:
大括號中的宏,例如{foreach ...}
n:宏,例如n:if =“...”
# 安裝和使用
如何安裝Latte的最好方法是下載最新的[軟件包](https://github.com/nette/latte/releases)或使用Composer:
~~~
php composer.phar require latte/latte
~~~
Latte需要PHP 5.3.1或更高版本。
如何渲染模板? 只需運行這段代碼:
~~~
$latte = new Latte\Engine;
$latte->setTempDirectory('/path/to/tempdir');
$parameters['items'] = ['one', 'two', 'three'];
//渲染輸出
$latte->render('template.latte', $parameters);
// 或呈現為字符串
$html = $latte->renderToString('template.latte', $parameters);
~~~
# 宏命令
您可以在額外頁面上找到所有默認宏命令的詳細說明。 此外,您可以制作自己的宏命令。
每對宏命令,例如{if} ... {/ if},對單個HTML元素操作可以寫成n:宏命令符號。 因此,可以以相同的方式寫入{foreach}宏命令:
~~~
<ul n:if="$items">
<li n:foreach="$items as $item">{$item|capitalize}</li>
</ul>
~~~
使用n:宏命令你可以做更多的有趣的技巧,你會看到一會兒。
{$ item | capitalize}宏命令打印$ item變量包含所謂的過濾器,在這種情況下大寫字母過濾器使每個單詞的第一個字母大寫。
Latte的非常重要的特性是它默認轉義變量。 打印變量時需要轉義,因為我們必須將HTML中有特殊含義的所有字符轉換為其他序列。 如果我們忘記它可能導致一個嚴重的安全漏洞稱為跨站腳本(XSS)。
由于在不同文檔和頁面的不同部分需要不同的轉義功能,Latte提供了一種獨特的上下文感知轉義技術,它識別宏命令被放置的上下文,并選擇正確的轉義模式。 你不必擔心你的編碼器忘了它導致你出現一個安全漏洞。 這是偉大的!
你仍然可以使用PHP里面的宏命令,包括注釋。 但Latte還擴展了PHP語法有三個令人愉快的功能:
1、數組可以寫成[1,2,3],這與PHP中的[1,2,3]相同
2、我們可以省略由字母,數字和破折號組成的字符串周圍的引號
3、短條件符號$ a? 'b'與$ a相同? 'b':在PHP中為null
例如:
~~~
{foreach [a, b, c] as $id} ... {/foreach}
{$cond ? hello} // 如果$ cond等于true,則打印'hello'
~~~
# n:宏命令
我們顯示n:宏命令應該直接寫入HTML標簽,作為他們的特殊屬性。 我們還說每對宏命令(例如{if} ... {/ if})可以用n:宏命令表示。 然后,宏對應于寫入它的HTML元素:
~~~
{var $items = ['I', '?', 'Nette Framework']}
<p n:foreach="$items as $item">{$item}</p>
~~~
打印:
~~~
<p>I</p>
<p>?</p>
<p>Nette Framework</p>
~~~
通過使用內部前綴,我們可以改變行為,使宏命令只適用于元素的主體:
~~~
<div n:inner-foreach="$items as $item">
<p>{$item}</p>
<hr>
</div>
~~~
打印:
~~~
<div>
<p>I</p>
<hr>
<p>?</p>
<hr>
<p>Nette Framework</p>
<hr>
</div>
~~~
或者通過使用標記前綴,宏命令僅應用于HTML標記:
~~~
<p><a href="{$url}" n:tag-if="$url">Title</a></p>
~~~
根據$ url變量的值,這將打印:
~~~
// 當$ url是空的
<p>Title</p>
// 當$ url等于'https://nette.org'
<p><a href="https://nette.org">Title</a></p>
~~~
然而,n:宏命令不僅是對宏的快捷方式,還有一些純n:宏,例如編碼器的最好的朋友n:類宏。
# 過濾器
Latte通過使用特殊符號調用過濾器(允許前面的有空格):
~~~
<h1>{$heading|upper}</h1>
~~~
過濾器(或修飾符)可以一起使用,在這種情況下,它們從左到右依次應用:
~~~
<h1>{$heading|lower|capitalize}</h1>
~~~
參數放在過濾器名稱后面,用冒號或逗號分隔:
~~~
<h1>{$heading|truncate:20,''}</h1>
~~~
過濾器可以通過任何回調或lambda函數注冊:
~~~
$latte = new Latte\Engine;
$latte->addFilter('shortify', function ($s) {
return mb_substr($s, 0, 10); //將文本縮短為10個字符
});
~~~
在這種情況下,過濾器會得到一個額外的參數:
~~~
$latte->addFilter('shortify', function ($s, $len = 10) {
return mb_substr($s, 0, $len);
});
~~~
我們這樣的模板中調用它:
~~~
<p><?php echo $template->shortify($text, 100); ?></p>
~~~
Latte簡化了符號 - 過濾器由特殊符號表示,它們可以組合(它們從左到右依次應用)。 參數用冒號或逗號分隔:
~~~
<p>{$text|shortify:100}</p>
~~~
# 通用過濾器
手動注冊多個過濾器可以替換為單個通用注冊:
~~~
$template->addFilter(NULL, 'Filters::common');
~~~
過濾器:common將過濾器的名稱作為第一個參數。
~~~
class Filters
{
public static function common($filter, $value)
{
if (method_exists(__CLASS__, $filter)) {
$args = func_get_args();
array_shift($args);
return call_user_func_array([__CLASS__, $filter], $args);
}
}
public static function shortify($s, $len = 10)
{
return mb_substr($s, 0, $len);
}
}
~~~
# 性能
Latte?運行很快。 它將模板編譯為本機PHP代碼,并將它們存儲在磁盤的緩存中。 因此,它們就像用純PHP編寫的一樣快。
每次我們更改源文件時,模板都會自動重新編譯。 在開發時,您只需要編輯Latte中的模板,并且更改會立即顯示在瀏覽器中。
# 調試
每一個錯誤或打字錯誤,你將被告知Tracy所有的奢侈。 顯示模板源代碼,紅線標記顯示錯誤消息的錯誤。 只需單擊一下,您可以在您喜歡的編輯器中打開模板,并立即修復錯誤。 十分簡單!
如果您使用帶有代碼步進的IDE,您可以通過模板生成的PHP代碼。
# 可用性
Latte語法不是由工程師發明的,而是來自webdesigner的實際需求。 我們正在尋找最友好的語法,你甚至可以寫出最有問題的結構足夠舒服。 你會驚訝的是,Latte可以多少有一些幫助。
您可以找到用于高級布局管理,模板繼承,嵌套塊等的宏。 語法來自PHP本身,所以你不必學習任何新的,你可以利用你的專有技術。
# 上下文感知轉義
雖然跨站腳本(XSS)是利用網頁的一種簡單的方法,它是最常見的漏洞,但非常嚴重。 它可能導致身份盜竊等。 最好的防御是一致的逃脫打印數據,即。 轉換在給定上下文中具有特殊含義的字符。
如果編碼器省略了逃逸,則產生安全漏洞。 這就是為什么模板引擎實現自動轉義。 問題是網頁具有不同的上下文,并且每個具有用于轉義打印數據的不同規則。 如果使用錯誤的轉義函數,則會顯示安全漏洞。
但Latte是復雜的。 它具有上下文感知轉義的獨特技術,它識別宏命令被放置的上下文,并選擇正確的轉義模式。 這意味著什么?
Latte不需要任何手動工作。 一切都是自動,一致和正確。 你不必擔心安全漏洞。
讓我們看看它是如何工作的:
~~~
<p onclick="alert({$movie})">{$movie}</p>
<script>var movie = {$movie};</script>
~~~
如果$ movie變量存儲'Amarcord&8 1/2'字符串,它將生成以下輸出。 注意在HTML和JavaScript以及onclick屬性中使用的不同轉義:
~~~
<p onclick="alert("Amarcord & 8 1\/2")">Amarcord & 8 1/2</p>
<script>var movie = "Amarcord & 8 1\/2";</script>
~~~
感謝上下文感知轉義模板很簡單,你的應用程序完全防止跨站點腳本。 你可以在JavaScript中使用PHP變量!
# 一個漂亮的輸出
Stickers將享受Latte生成的HTML輸出的外觀。 所有標簽縮進為他們應該。 代碼看起來像它已經處理與某種類型的HTML代碼美化:-)
# 用戶定義的宏命令
Latte提供API來創建自己的宏命令。 這根本不難。 宏命令是以集合的形式添加的(一個集合可以包含一個宏命令)。
~~~
$latte = new Latte\Engine;
//讓我們創建一個集合
$set = new Latte\Macros\MacroSet($latte->getCompiler());
// 添加一對對宏命令 {try}... {/try}
$set->addMacro(
'try', // 宏命令名稱
'try {', // PHP代碼替換開始大括號
'} catch (\Exception $e) {}' // 代碼替代閉包
);
~~~
如果我們省略addMacro()方法的最后一個參數,我們表示宏命令未配對。
PHP代碼中的第二和第三個參數可以包含標簽:
~~~
%node.word – 插入第一個宏參數
%node.array – 插入格式化為PHP數組的宏參數
%node.args – 插入格式化為PHP代碼的宏參數
%escape(...) –替換為當前的逃逸函數
%modify(...) – 替換為一系列修飾符
~~~
例如:
~~~
$set->addMacro('if', 'if (%node.args):', 'endif');
~~~
如果宏邏輯更復雜,我們可以使用回調或lambda函數,而不是字符串。 在第一個參數中,它們將獲得代表當前宏的MacroNode對象,第二個參數是幫助生成輸出代碼的PhpWriter對象。
~~~
$set->addMacro('if', function($node, $writer) {
return $writer->write('if (%node.args):');
}, 'endif');
~~~
# 從字符串加載到模板
您可以使用loader從字符串加載模板:
~~~
$latte->setLoader(new Latte\Loaders\StringLoader);
$template = '
{if true} {$var} {/if}
';
$latte->render($template, $parameters);
~~~
- Nette簡介
- 快速開始
- 入門
- 主頁
- 顯示文章詳細頁
- 文章評論
- 創建和編輯帖子
- 權限驗證
- 程序員指南
- MVC應用程序和控制器
- URL路由
- Tracy - PHP調試器
- 調試器擴展
- 增強PHP語言
- HTTP請求和響應
- 數據庫
- 數據庫:ActiveRow
- 數據庫和表
- Sessions
- 用戶授權和權限
- 配置
- 依賴注入
- 獲取依賴關系
- DI容器擴展
- 組件
- 字符串處理
- 數組處理
- HTML元素
- 使用URL
- 表單
- 驗證器
- 模板
- AJAX & Snippets
- 發送電子郵件
- 圖像操作
- 緩存
- 本土化
- Nette Tester - 單元測試
- 與Travis CI的持續集成
- 分頁
- 自動加載
- 文件搜索:Finder
- 原子操作