成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

ThinkPHP中模板引擎是什么-創(chuàng)新互聯(lián)

這篇文章主要介紹ThinkPHP中模板引擎是什么,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

在新昌等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計制作、網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作按需求定制開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),網(wǎng)絡(luò)營銷推廣,成都外貿(mào)網(wǎng)站建設(shè)公司,新昌網(wǎng)站建設(shè)費用合理。

模板引擎由來

早期做PHP開發(fā)WEB應(yīng)用都是把PHP代碼和HTML模板混在一起,模板引擎的誕生主要就是為了解決后端與前端的完全分離(現(xiàn)在來看其實是屬于不完全分離)的問題,讓開發(fā)與美工可以分工合作(雖然實際上最終模板工作大多仍然是由后端開發(fā)人員完成),從而提高開發(fā)效率和便于維護。

伴隨著PHP的快速成長,模板引擎也越來越多,但大致分為解釋型和編譯型兩種,目前主流的模板引擎大多數(shù)是編譯型的,也就是會先把模板編譯成PHP文件執(zhí)行,只要模板文件本身不變化,就不需要重新編譯,例如老牌的Smarty。解釋型的模板引擎每次執(zhí)行的時候都會進行模板解析流程,例如小強(tinybutstrong)。

ThinkPHP從一開始就內(nèi)置了一個基于XML標簽庫技術(shù)的編譯型模板引擎,早期參考自Struts,并且不斷在汲取新的思想不斷進化。

如何選擇模板引擎

目前主流框架都帶有模板引擎組件或者封裝了模板引擎的實現(xiàn),因此選擇內(nèi)置的解決方案是很好之選,功能和穩(wěn)定性都有保證。目前最流行的模板引擎當屬Laravel自帶的Blade模板引擎,以及Symfony自帶的Twig模板引擎。

通過安裝模板引擎擴展,你可以在ThinkPHP中輕松使用包括Angular、Twig和Blade在內(nèi)的模板引擎,甚至完全不使用模板引擎而是直接用PHP文件作為模板。

因為近幾年三大前端框架(React/Vue/Angular)的流行,前后端分離開發(fā)逐漸成為主流,因此從ThinkPHP5.0開始定位為API開發(fā)而設(shè)計,導(dǎo)致模板引擎的概念已經(jīng)被弱化了。ThinkPHP5.1版本的模板引擎進行過一次內(nèi)部的重構(gòu),使得模板標簽更加易用和接近PHP語法。

至少對于大部分新的應(yīng)用來說,應(yīng)該選擇更主流的前后端分離設(shè)計,盡量減輕服務(wù)端的壓力,也更方便前后端單獨測試。你會在市面上不經(jīng)意的看到采用Vue和ThinkPHP的產(chǎn)品(之前幾期的ThinkPHP開發(fā)者周刊曾經(jīng)報道過幾個)。如果是維護一些老項目尤其是內(nèi)容管理產(chǎn)品的時候,仍然可能會用到模板引擎。

鑒于這種情況,下一個版本的ThinkPHP框架將不會內(nèi)置模板引擎,但有需要使用模板引擎的開發(fā)者仍然可以使用官方獨立出來的think-template類庫,具體使用可以參考這篇文章。

后面的篇幅,我們主要來總結(jié)下ThinkPHP內(nèi)置的模板引擎的使用和技巧。

模板執(zhí)行流程

系統(tǒng)內(nèi)部的模板引擎調(diào)用關(guān)系如下:

視圖(View) <=> 模板驅(qū)動(Driver) <=> 模板引擎(Template)

視圖和模板引擎之間增加了一個驅(qū)動層,所以可以很方便的替換其它的模板引擎。通常我們在控制器中調(diào)用的assign/fetch等方法其實都是調(diào)用的think\View類的方法。當然,如果有必要,你也完全可以直接在控制器中操作模板引擎類,只是不方便切換其它模板引擎。

以fetch方法為例,我們看下最終的調(diào)用過程:

think\Controller->fetch();
think\View->fetch();
think\view\driver\Think->fetch();
think\Template->fetch();

如果你調(diào)用fetch方法的時候沒有傳入要渲染的完整模板文件名,則會在第三步的時候自動識別要渲染的模板文件。

很顯然,最關(guān)鍵是最后一步,模板編譯和執(zhí)行的流程則全部由

think\Template->fetch();

方法完成,這個環(huán)節(jié)大體又可以分成幾個流程。

1、判斷和讀取頁面渲染緩存

如果當前模板設(shè)置了頁面輸出緩存并且已經(jīng)渲染輸出過,如果是則會讀取緩存中的輸出內(nèi)容直接輸出。

if (!empty($this->config['cache_id']) && $this->config['display_cache']) {
    // 讀取渲染緩存
    $cacheContent = $cache->get($this->config['cache_id']);
    if (false !== $cacheContent) {
        echo $cacheContent;
        return;
    }
}

2、定位模板文件

定位實際的模板文件操作由模板引擎類的parseTemplateFile方法實現(xiàn),這個方法的邏輯其實和視圖驅(qū)動類的parseTemplate方法是類似的,如果最終的模板文件不存在則會拋出一個模板文件不存在的異常。

$template = $this->parseTemplateFile($template);

3、判斷編譯緩存

如果當前的模板文件已經(jīng)編譯過,會判斷緩存是否還有效,有效的話就不用重復(fù)解析直接讀取緩存的解析內(nèi)容。由checkCache方法負責(zé)完成。

if (!$this->checkCache($cacheFile)) {
    // 緩存無效 重新模板編譯
    $content = file_get_contents($template);
    $this->compiler($content, $cacheFile);
}

4、模板編譯并緩存

這一步驟是模板引擎最核心的環(huán)節(jié),也是功能最復(fù)雜的地方,由compiler方法負責(zé)完成,主要是解析當前模板文件中的模板標簽語法為PHP可執(zhí)行代碼,然后生成一個模板解析緩存文件,也就是所謂的模板“編譯”,其中使用了大量的正則表達式替換技術(shù),雖然正則解析有一定的性能開銷,但得益于一次解析多次調(diào)用的緩存原理,基本上模板解析的性能開銷不會影響實際使用的性能。

模板編譯方法的關(guān)鍵代碼是parse方法,parse方法負責(zé)對模板文件中的標簽進行解析,然后寫入編譯緩存文件,編譯緩存默認使用的是文件緩存,支持擴展。

5、讀取編譯緩存

模板編譯的過程只是生成了模板編譯緩存文件,并沒有真正載入模板,這一步驟就是載入模板編譯緩存,然后導(dǎo)入模板變量。實現(xiàn)方法可以參考think\template\driver\File類的read方法。

public function read($cacheFile, $vars = [])
{
    $this->cacheFile = $cacheFile;
    if (!empty($vars) && is_array($vars)) {
        // 模板陣列變量分解成為獨立變量
        extract($vars, EXTR_OVERWRITE);
    }
    //載入模版緩存文件
    include $this->cacheFile;
}

6、緩存頁面輸出

如果當前模板渲染的時候開啟了頁面輸出緩存,就會這一步生成頁面渲染后的輸出緩存。

模板編譯原理

我們來了解下ThinkPHP的模板引擎的實現(xiàn)原理。前面提到過,ThinkPHP的模板引擎最早源于Struts的設(shè)計理念,基于XML和標簽庫的技術(shù)實現(xiàn)。在設(shè)計模板語言的時候使用系統(tǒng)固定的標簽來實現(xiàn)普通的變量輸出功能(所以稱之為普通標簽),而利用XML標簽庫技術(shù)實現(xiàn)的動態(tài)標簽用于變量的控制或者條件判斷輸出。

普通標簽的解析是由think\Template類的parseTag方法完成的,主要實現(xiàn)了下面幾個模板功能:

·變量輸出(包括系統(tǒng)變量);

·函數(shù)過濾;

·變量運算;

·三元運算;

·執(zhí)行函數(shù)以及輸出結(jié)果;

·模板注釋。

標簽庫采用的是動態(tài)擴展的設(shè)計方案,采用了類似XML的閉合/開放定義方式(這個其實也是目前模板引擎的一個局限所在),例如下面的這個:

// 閉合類型標簽
<tagLib:tagName name="value" >
...
</tagLib:tagName>
// 開放類型標簽
<tagLib:tagName name="value" />

tagLib就代表了一個標簽庫(類),后面的tagName標簽就表示該標簽庫下面的某個標簽(通常對應(yīng)了標簽庫類的某個方法),后面的屬性就是該標簽支持的屬性定義。具體該標簽的屬性和功能則完全由標簽庫類的這個方法來決定。

可以在模板開頭明確指出,當前模板使用了哪些標簽庫

{taglib name="html,article" /}

所以要擴展模板引擎的功能只需要通過擴展一個標簽庫類就可以了。大多數(shù)的內(nèi)容管理系統(tǒng)都會定義一套自己的模板二次開發(fā)標簽,利用標簽庫功能就可以很方便的定義一套屬于自己的標簽功能。

系統(tǒng)內(nèi)置了一套標簽庫Cx,主要用于文件包含、條件控制、循環(huán)輸出等功能。內(nèi)置標簽庫在使用的時候無需引入,而且在使用的時候可以省略標簽庫前綴,例如:

{foreach $list as $key=>$vo } 
    {$vo.id}:{$vo.name}
{/foreach}

這個模板語法相信PHP開發(fā)的很容易上手,上面的標簽解析由think\template\taglib\Cx類的tagForeach方法完成,該方法的返回值是一個字符串,其實就是最終會解析成的一段包含變量的PHP可執(zhí)行代碼。

到這里,模板引擎的執(zhí)行過程和原理現(xiàn)在基本就明白了,剩下的就是模板標簽的解析細節(jié),考驗的就是正則表達式的掌握程度了。本文就不做深入了,有興趣的朋友可以去看一些正則表達式的相關(guān)資料(例如這本《正則指引》,開發(fā)者周刊第14期也提供了一些在線的正則工具)。

遵循的原則

使用模板引擎,要盡量遵循幾個重要的原則。

不要在模板文件中添加任何的業(yè)務(wù)邏輯

模板的作用主要是進行模板變量的控制和輸出,不要在模板文件中添加業(yè)務(wù)邏輯代碼。

明確指定渲染模板

養(yǎng)成明確指定渲染模板的好習(xí)慣,避免當方法名發(fā)生變化,或者被其它方法調(diào)用的時候發(fā)生錯誤。也不易受模板命名規(guī)范的影響。

變量統(tǒng)一賦值

使用assign方法或者在view助手函數(shù)的時候,統(tǒng)一一次傳入模板變量。不要多次賦值,以免混亂。

系統(tǒng)變量無需賦值到模板

對于系統(tǒng)變量(包括請求變量、$_SESSION和$_SERVER等系統(tǒng)變量)無需進行模板變量賦值,可以直接在模板中輸出。

常見問題

這里總結(jié)一下經(jīng)常會遇到的一些常見問題。

修改定界符

可以通過模板配置文件修改模板標簽的定界符。

例如,修改普通標簽定界符

'tpl_begin' => '{{', // 模板引擎普通標簽開始標記
'tpl_end' => '}}', // 模板引擎普通標簽結(jié)束標記

標簽庫標簽定界符

'taglib_begin' => '<{', // 標簽庫標簽開始標記
'taglib_end' => '}>', // 標簽庫標簽結(jié)束標記

保持原樣輸出

如果擔(dān)心模板標簽和JS代碼產(chǎn)生混淆,可以使用literal標簽

{literal} Hello,{$name}! {/literal}

頁面最終會直接輸出

Hello,{$name}!

避免輸出轉(zhuǎn)義

5.1版本為了避免XSS攻擊,默認對模板變量的輸出使用了安全轉(zhuǎn)義,默認的轉(zhuǎn)義函數(shù)是htmlentities,你可以通過更改default_filter配置改變默認的轉(zhuǎn)義函數(shù)。

如果你不需要對某個模板變量輸出進行轉(zhuǎn)義(例如包含了HTML代碼),可以使用:

{$data.content|raw}

分頁輸出就是一個需要輸出HTML的典型例子,因此必須增加|raw。

關(guān)于模板主題

新版取消了原來的模板主題功能,因為模板主題對模板引擎來說,其實無非是一個模板目錄,完全可以根據(jù)自己的需求控制。

例如

$theme = 'blue';
$this->fetch('/' . $theme. '/user/index');

或者動態(tài)設(shè)置模板引擎的view_path參數(shù)

$this->view->config('view_path', \think\facade\App::getModulePath(). 'view/'. $theme . '/');

如何關(guān)閉模板緩存

由于是編譯型模板引擎,模板標簽不能被直接執(zhí)行,必須編譯成PHP語法后才能執(zhí)行,因此不能關(guān)閉模板編譯緩存,模板引擎每次執(zhí)行渲染的時候會檢測模板文件是否有變化,當模板文件的修改時間超過模板編譯緩存的修改時間后,模板引擎會自動更新編譯緩存。

但你可以強制模板引擎每次都重新編譯,只需要在配置文件中設(shè)置

'tpl_cache' => false, // 關(guān)閉模板緩存

使用PHP作為模板引擎

如果不希望使用內(nèi)置的模板引擎,直接使用PHP作為模板引擎,可以配置

'type' => 'php',

配置使用PHP作為模板引擎的話,是不會生成模板編譯緩存的。

如何使用第三方模板引擎

系統(tǒng)支持擴展其它的第三方模板引擎,你只需要開發(fā)一個模板引擎驅(qū)動,目前已經(jīng)支持的第三方模板引擎包括Smarty、Twig和Blade。

如何跨模塊輸出模板

要渲染一個跨模塊的模板文件,你需要使用

// 渲染user模塊的模板文件
$this->fetch('User@order/index');

是否支持變量運算

可以直接在模板文件中進行變量運算而不需要在控制器中進行運算后再賦值都模板變量輸出。

{$score1+$score2}
{$count++}

文件包含是否支持變量

include標簽可以支持傳入變量,但只能使用

{include file="$file" /}

而不能使用

{include file="file_$name" /}

可以支持模板輸出替換么

支持兩個方式對模板進行輸出替換,如果需要對模板文件的內(nèi)容進行替換,可以配置:

'tpl_replace_string'  =>  [
    '__STATIC__'=>'/static',
'__JS__' => '/static/javascript',
]

如果是對模板渲染輸出的內(nèi)容進行替換,可以在控制器中使用視圖過濾功能:

public function index()
{
    // 使用視圖輸出過濾
    return $this->filter(function($content){
    return str_replace("\r\n",'<br/>',$content);
    })->fetch();
}

模板繼承的block是否支持嵌套

目前模板繼承的block無法支持嵌套功能,你應(yīng)該使用其它方式解決。

以上是“ThinkPHP中模板引擎是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

分享標題:ThinkPHP中模板引擎是什么-創(chuàng)新互聯(lián)
轉(zhuǎn)載源于:http://jinyejixie.com/article8/dhdsip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計網(wǎng)站營銷、營銷型網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作關(guān)鍵詞優(yōu)化、靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運營
连平县| 勃利县| 桐城市| 会昌县| 崇明县| 监利县| 文昌市| 昌都县| 酒泉市| 襄汾县| 轮台县| 拉萨市| 洛南县| 南郑县| 长武县| 巴东县| 全南县| 屏东市| 申扎县| 宿州市| 永和县| 大英县| 崇明县| 营山县| 孟连| 绵竹市| 肇东市| 赫章县| 阿拉善右旗| 霍林郭勒市| 大同县| 大悟县| 台东市| 河东区| 星子县| 星子县| 崇仁县| 镶黄旗| 凤台县| 长乐市| 凤台县|