Twig:一款流行的PHP模板引擎
Twig是由Sensio Labs開發的PHP流行模板引擎,它簡化了PHP代碼,並增加了安全和調試等功能。 Twig同時作用於項目的frontend和backend,可以從兩個角度來看:模板設計師的Twig和開發者的Twig。 Twig使用名為Environment
的核心對象來存儲配置、擴展,並從文件系統或其他位置加載模板。 Twig支持嵌套模板(塊),避免模板中元素重複,並能緩存編譯後的模板以加快後續請求速度。 Twig支持條件語句、循環和過濾器來控制模板中信息的顯示,並提供調試功能來轉儲模板變量的所有信息。
本文由Wern Ancheta同行評審。感謝所有SitePoint的同行評審員,使SitePoint的內容達到最佳狀態!
Twig是PHP的模板引擎。但是,PHP本身不是模板引擎嗎?是的,也不是!儘管PHP最初是作為模板引擎,但它的發展並非如此,雖然我們仍然可以將其用作模板引擎,請問您更喜歡哪個版本的“Hello world”:
<code class="language-php"><?php echo "<p> Hello " . $name . "</p>"; ?></code>
還是
<code class="language-twig"><p>Hello {{ name }}</p></code>
PHP是一種冗長的語言,在嘗試輸出HTML內容時,這種冗長性會被放大。現代模板系統將消除部分冗長性,並在其之上增加相當多的功能。諸如安全和調試功能之類的特性是現代模板引擎的支柱。今天,我們將重點介紹Twig。
Twig是由Sensio Labs(Blackfire和Symfony的開發公司)創建的模板引擎。讓我們來看看它的主要優勢以及如何在項目中使用它。
安裝
安裝Twig有兩種方法。我們可以使用其網站上提供的tar包,或者像我們一直做的那樣,使用Composer。
<code class="language-bash">composer require twig/twig</code>
我們假設您正在運行已設置PHP並全局安裝Composer的環境。最好的方法是使用Homestead Improved——它可以讓您在5分鐘內在與我們使用的完全相同的機器上開始使用,這樣我們就能在同一頁面上。如果您想了解有關PHP環境的更多信息,我們這裡有一本關於此的優秀付費書籍可供購買。
在我們繼續之前,我們需要先澄清一些事情。作為模板引擎,Twig同時作用於項目的frontend和backend。因此,我們可以從兩個不同的角度來看待Twig:模板設計師的Twig和開發者的Twig。一方面,我們準備所有需要的數據;另一方面,我們呈現所有這些數據。
基本用法
為了舉例說明Twig的基本用法,讓我們創建一個簡單的項目。首先,我們需要引導Twig。讓我們創建一個包含以下內容的bootstrap.php
文件:
<code class="language-php"><?php echo "<p> Hello " . $name . "</p>"; ?></code>
Twig使用名為Environment
的核心對象。此類的實例用於存儲配置、擴展,並從文件系統或其他位置加載模板。在我們的Twig實例引導後,我們可以繼續創建一個index.php
文件,在其中加載一些數據並將其傳遞給Twig模板。
<code class="language-twig"><p>Hello {{ name }}</p></code>
這是一個簡單的示例;我們正在創建一個包含產品的數組,例如我們的機械鍵盤,我們可以在模板中使用它。然後,我們使用render()
方法,它接受模板名稱(這是我們之前定義的模板文件夾中的一個文件)以及我們要傳遞給模板的數據。為了完成我們的示例,讓我們進入我們的/templates
文件夾並創建一個index.html
文件。首先,讓我們看看模板本身。
<code class="language-bash">composer require twig/twig</code>
在瀏覽器中打開index.php
(訪問localhost或homestead.app,具體取決於您如何設置主機和服務器)現在應該會顯示以下屏幕:
但是讓我們回到並仔細看看我們的模板代碼。有兩種類型的分隔符:{{ ... }}
用於打印表達式或操作的結果,而{% ... %}
用於執行諸如條件語句和循環之類的語句。這些分隔符是Twig的主要語言結構,Twig使用它們來“告知”模板它必須呈現Twig元素。
(以下內容與原文類似,但做了部分語句調整和段落劃分,並保持了圖片位置不變)
佈局
為了避免在模板中重複元素(如頁眉和頁腳),Twig允許我們將模板嵌套在模板中,這些被稱為塊。為了舉例說明這一點,讓我們將實際內容與示例中的HTML定義分開。讓我們創建一個新的HTML文件並將其命名為layout.html
:
<code class="language-php"><?php // 加载我们的自动加载器 require_once __DIR__.'/vendor/autoload.php'; // 指定我们的Twig模板位置 $loader = new Twig_Loader_Filesystem(__DIR__.'/templates'); // 实例化我们的Twig $twig = new Twig_Environment($loader);</code>
我們創建了一個名為content
的塊。我們的意思是,每個從layout.html
擴展的模板都可以實現一個content
塊,該塊將顯示在該位置。這樣,我們可以多次重用佈局而無需重寫它。在本例中,index.html
文件現在如下所示:
<code class="language-php"><?php require_once __DIR__.'/bootstrap.php'; // 创建产品列表 $products = [ [ 'name' => 'Notebook', 'description' => 'Core i7', 'value' => 800.00, 'date_register' => '2017-06-22', ], [ 'name' => 'Mouse', 'description' => 'Razer', 'value' => 125.00, 'date_register' => '2017-10-25', ], [ 'name' => 'Keyboard', 'description' => 'Mechanical Keyboard', 'value' => 250.00, 'date_register' => '2017-06-23', ], ]; // 渲染我们的视图 echo $twig->render('index.html', ['products' => $products] );</code>
Twig還允許我們只渲染單個塊。為此,我們需要首先加載模板,然後渲染塊。
<code class="language-html"><!DOCTYPE html> <meta charset="UTF-8"> <title>Twig Example</title> <table> border="1" style="width: 80%;"> <thead> <tr> <td>Product</td> <td>Description</td> <td>Value</td> <td>Date</td> </tr> </thead> <tbody> {% for product in products %} <tr> <td>{{ product.name }}</td> <td>{{ product.description }}</td> <td>{{ product.value }}</td> <td>{{ product.date_register|date("m/d/Y") }}</td> </tr> {% endfor %} </tbody> </table> </code>
此時,我們仍然擁有相同的頁面,但我們通過分離上下文塊來降低了它的複雜性。
緩存
Environment
對像不僅可以用於加載模板。如果我們使用關聯目錄的cache
選項傳遞,Twig將緩存編譯後的模板,從而避免在後續請求中解析模板。編譯後的模板將存儲在我們提供的目錄中。請注意,這是編譯模板的緩存,而不是已評估的模板的緩存。這意味著Twig將解析、編譯並保存模板文件。所有後續請求仍然需要評估模板,但第一步已經為您完成。讓我們通過編輯bootstrap.php
文件來緩存示例中的模板:
<code class="language-php"><?php echo "<p> Hello " . $name . "</p>"; ?></code>
(以下內容與原文類似,但做了部分語句調整和段落劃分,並保持了圖片位置不變)
循環
在我們的示例中,我們已經看到瞭如何使用Twig進行循環。基本上,我們使用for
標籤並為指定數組中的每個元素分配一個別名。在本例中,我們為products
數組分配了別名product
。之後,我們可以使用.
運算符訪問每個數組元素中的所有屬性。我們使用endfor
標籤來指示循環的結束。我們還可以使用..
運算符循環遍歷數字或字母。如下所示:
<code class="language-twig"><p>Hello {{ name }}</p></code>
或字母:
<code class="language-bash">composer require twig/twig</code>
此運算符只是range
函數的語法糖,其工作方式與本機PHPrange
函數相同。同樣有用的選項是向循環添加條件。使用條件,我們可以過濾要迭代的元素。假設我們想要迭代所有值小於250的產品:
<code class="language-php"><?php // 加载我们的自动加载器 require_once __DIR__.'/vendor/autoload.php'; // 指定我们的Twig模板位置 $loader = new Twig_Loader_Filesystem(__DIR__.'/templates'); // 实例化我们的Twig $twig = new Twig_Environment($loader);</code>
條件語句
Twig還以if
、elseif
、if not
和else
標籤的形式提供條件語句。就像在任何編程語言中一樣,我們可以使用這些標籤來過濾模板中的條件。假設在我們的示例中,我們只想顯示值高於500的產品:
<code class="language-php"><?php require_once __DIR__.'/bootstrap.php'; // 创建产品列表 $products = [ [ 'name' => 'Notebook', 'description' => 'Core i7', 'value' => 800.00, 'date_register' => '2017-06-22', ], [ 'name' => 'Mouse', 'description' => 'Razer', 'value' => 125.00, 'date_register' => '2017-10-25', ], [ 'name' => 'Keyboard', 'description' => 'Mechanical Keyboard', 'value' => 250.00, 'date_register' => '2017-06-23', ], ]; // 渲染我们的视图 echo $twig->render('index.html', ['products' => $products] );</code>
過濾器
過濾器允許我們過濾傳遞給模板的信息以及顯示信息的格式。讓我們看看一些最常用和最重要的過濾器。 Twig過濾器的完整列表可以在這裡找到。
date_modify
date
過濾器將日期格式化為給定格式。正如我們在示例中看到的:
<code class="language-html"><!DOCTYPE html> <meta charset="UTF-8"> <title>Twig Example</title> <table> border="1" style="width: 80%;"> <thead> <tr> <td>Product</td> <td>Description</td> <td>Value</td> <td>Date</td> </tr> </thead> <tbody> {% for product in products %} <tr> <td>{{ product.name }}</td> <td>{{ product.description }}</td> <td>{{ product.value }}</td> <td>{{ product.date_register|date("m/d/Y") }}</td> </tr> {% endfor %} </tbody> </table> </code>
我們以月/日/年的格式顯示日期。除了date
過濾器之外,我們還可以使用修飾符字符串使用date_modify
過濾器更改日期。例如,如果我們想向日期添加一天,我們可以使用以下內容:
<code class="language-html"><!DOCTYPE html> <meta charset="UTF-8"> <title>Tutorial Example</title> {% block content %} {% endblock %} </code>
format
通過替換所有佔位符來格式化給定字符串。例如:
<code class="language-html">{% extends "layout.html" %} {% block content %} <table> border="1" style="width: 80%;"> <thead> <tr> <td>Product</td> <td>Description</td> <td>Value</td> <td>Date</td> </tr> </thead> <tbody> {% for product in products %} <tr> <td>{{ product.name }}</td> <td>{{ product.description }}</td> <td>{{ product.value }}</td> <td>{{ product.date_register|date("m/d/Y") }}</td> </tr> {% endfor %} </tbody> </table> {% endblock %}</code>
striptags
striptags
過濾器去除SGML/XML標籤,並將相鄰的空格替換為空格:
<code class="language-php"><?php echo "<p> Hello " . $name . "</p>"; ?></code>
escape
escape
是最重要的過濾器之一。它過濾字符串以安全地插入最終輸出中。默認情況下,它使用HTML轉義策略,因此
<code class="language-twig"><p>Hello {{ name }}</p></code>
等效於
<code class="language-bash">composer require twig/twig</code>
js
、css
、url
和html_attr
轉義策略也可使用。它們分別為Javascript、CSS、URI和HTML屬性上下文轉義字符串。
調試
最後,讓我們來看看調試。有時我們需要訪問模板變量的所有信息。為此,Twig具有dump()
函數。此函數默認情況下不可用。在創建Twig環境時,我們必須添加Twig_Extension_Debug
擴展:
<code class="language-php"><?php // 加载我们的自动加载器 require_once __DIR__.'/vendor/autoload.php'; // 指定我们的Twig模板位置 $loader = new Twig_Loader_Filesystem(__DIR__.'/templates'); // 实例化我们的Twig $twig = new Twig_Environment($loader);</code>
此步驟是必要的,這樣我們才不會意外地在生產服務器上洩露調試信息。配置完成後,我們只需使用dump()
函數即可轉儲有關模板變量的所有信息。
<code class="language-php"><?php require_once __DIR__.'/bootstrap.php'; // 创建产品列表 $products = [ [ 'name' => 'Notebook', 'description' => 'Core i7', 'value' => 800.00, 'date_register' => '2017-06-22', ], [ 'name' => 'Mouse', 'description' => 'Razer', 'value' => 125.00, 'date_register' => '2017-10-25', ], [ 'name' => 'Keyboard', 'description' => 'Mechanical Keyboard', 'value' => 250.00, 'date_register' => '2017-06-23', ], ]; // 渲染我们的视图 echo $twig->render('index.html', ['products' => $products] );</code>
結論
希望本文能為您提供Twig基礎知識的堅實基礎,並立即啟動您的項目!如果您想更深入地了解Twig,官方網站提供了您可以查閱的非常好的文檔和參考。您使用模板引擎嗎?您對Twig有什麼看法?您會將它與Blade或Smarty等流行的替代方案進行比較嗎?
(以下內容為FAQ,原文已包含,此處略去)
以上是樹枝 - 最受歡迎的獨立PHP模板引擎的詳細內容。更多資訊請關注PHP中文網其他相關文章!