首頁 >後端開發 >php教程 >樹枝 - 最受歡迎的獨立PHP模板引擎

樹枝 - 最受歡迎的獨立PHP模板引擎

Lisa Kudrow
Lisa Kudrow原創
2025-02-09 09:07:11863瀏覽

Twig - the Most Popular Stand-Alone PHP Template Engine

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 - the Most Popular Stand-Alone PHP Template Engine

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 - the Most Popular Stand-Alone PHP Template Engine

但是讓我們回到並仔細看看我們的模板代碼。有兩種類型的分隔符:{{ ... }}用於打印表達式或操作的結果,而{% ... %}用於執行諸如條件語句和循環之類的語句。這些分隔符是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還以ifelseifif notelse標籤的形式提供條件語句。就像在任何編程語言中一樣,我們可以使用這些標籤來過濾模板中的條件。假設在我們的示例中,我們只想顯示值高於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>

jscssurlhtml_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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn