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

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁(yè)開發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)

判斷密碼強(qiáng)度需結(jié)合正則與邏輯處理,基礎(chǔ)要求包括:1.長(zhǎng)度不少於8位;2.至少含小寫字母、大寫字母、數(shù)字;3.可加入特殊字符限制;進(jìn)階方面需避免連續(xù)重複字符及遞增/遞減序列,這需PHP函數(shù)檢測(cè);同時(shí)應(yīng)引入黑名單過濾常見弱密碼如password、123456;最終建議結(jié)合zxcvbn庫(kù)提升評(píng)估精度。

PHP變量作用域常見問題及解決方法包括:1.函數(shù)內(nèi)部無(wú)法訪問全局變量,需使用global關(guān)鍵字或參數(shù)傳入;2.靜態(tài)變量用static聲明,只初始化一次並在多次調(diào)用間保持值;3.超全局變量如$_GET、$_POST可在任何作用域直接使用,但需注意安全過濾;4.匿名函數(shù)需通過use關(guān)鍵字引入父作用域變量,修改外部變量則需傳遞引用。掌握這些規(guī)則有助於避免錯(cuò)誤並提升代碼穩(wěn)定性。

要安全處理PHP文件上傳需驗(yàn)證來源與類型、控製文件名與路徑、設(shè)置服務(wù)器限制並二次處理媒體文件。 1.驗(yàn)證上傳來源通過token防止CSRF並通過finfo_file檢測(cè)真實(shí)MIME類型使用白名單控制;2.重命名文件為隨機(jī)字符串並根據(jù)檢測(cè)類型決定擴(kuò)展名存儲(chǔ)至非Web目錄;3.PHP配置限制上傳大小及臨時(shí)目錄Nginx/Apache禁止訪問上傳目錄;4.GD庫(kù)重新保存圖片清除潛在惡意數(shù)據(jù)。

PHP註釋代碼常用方法有三種:1.單行註釋用//或#屏蔽一行代碼,推薦使用//;2.多行註釋用/.../包裹代碼塊,不可嵌套但可跨行;3.組合技巧註釋如用/if(){}/控制邏輯塊,或配合編輯器快捷鍵提升效率,使用時(shí)需注意閉合符號(hào)和避免嵌套。

寫好PHP註釋的關(guān)鍵在於明確目的與規(guī)範(fàn),註釋應(yīng)解釋“為什麼”而非“做了什麼”,避免冗餘或過於簡(jiǎn)單。 1.使用統(tǒng)一格式,如docblock(/*/)用於類、方法說明,提升可讀性與工具兼容性;2.強(qiáng)調(diào)邏輯背後的原因,如說明為何需手動(dòng)輸出JS跳轉(zhuǎn);3.在復(fù)雜代碼前添加總覽性說明,分步驟描述流程,幫助理解整體思路;4.合理使用TODO和FIXME標(biāo)記待辦事項(xiàng)與問題,便於後續(xù)追蹤與協(xié)作。好的註釋能降低溝通成本,提升代碼維護(hù)效率。

AgeneratorinPHPisamemory-efficientwaytoiterateoverlargedatasetsbyyieldingvaluesoneatatimeinsteadofreturningthemallatonce.1.Generatorsusetheyieldkeywordtoproducevaluesondemand,reducingmemoryusage.2.Theyareusefulforhandlingbigloops,readinglargefiles,or

ToinstallPHPquickly,useXAMPPonWindowsorHomebrewonmacOS.1.OnWindows,downloadandinstallXAMPP,selectcomponents,startApache,andplacefilesinhtdocs.2.Alternatively,manuallyinstallPHPfromphp.netandsetupaserverlikeApache.3.OnmacOS,installHomebrew,thenrun'bre

易於效率,啟動(dòng)啟動(dòng)tingupalocalserverenverenvirestoolslikexamppandacodeeditorlikevscode.1)installxamppforapache,mysql,andphp.2)uscodeeditorforsyntaxssupport.3)
