鍍金池/ 教程/ PHP/ 使用模板
依賴管理
安全
測(cè)試
使用模板
開(kāi)發(fā)實(shí)踐
入門指南
服務(wù)器與部署
社區(qū)
語(yǔ)言亮點(diǎn)
錯(cuò)誤與異常
虛擬化技術(shù)
資源
文檔撰寫(xiě)
數(shù)據(jù)庫(kù)
依賴注入
緩存
代碼風(fēng)格指南

使用模板

模板提供了一種簡(jiǎn)便的方式,將展現(xiàn)邏輯從控制器和業(yè)務(wù)邏輯中分離出來(lái)。

一般來(lái)說(shuō),模板包含應(yīng)用程序的 HTML 代碼,但也可以使用其他的格式,例如 XML 。

模板通常也被稱為「視圖」, 而它是 模型-視圖-控制器 (MVC) 軟件架構(gòu)模式第二個(gè)元素的 一部份 。

好處

使用模板的主要好處是可以將呈現(xiàn)邏輯與應(yīng)用程序的其他部分進(jìn)行分離。模板的單一職責(zé)就是呈現(xiàn)格式化后的內(nèi)容。它不負(fù)責(zé)數(shù)據(jù)的查詢,保存或是其他復(fù)雜的任務(wù)。進(jìn)一步促成了更干凈、更具可讀性的代碼,在團(tuán)隊(duì)協(xié)作開(kāi)發(fā)中尤其有用,開(kāi)發(fā)者可以專注服務(wù)端的代碼(控制器、模型),而設(shè)計(jì)師負(fù)責(zé)客戶端代碼 (網(wǎng)頁(yè)) 。

模板同時(shí)也改善了前端代碼的組織架構(gòu)。一般來(lái)說(shuō),模板放置在「視圖」文件夾中,每一個(gè)模板都放在獨(dú)立的一個(gè)文件中。這種方式鼓勵(lì)代碼重用,它將大塊的代碼拆成較小的、可重用的片段,通常稱為局部模板。舉例來(lái)說(shuō),網(wǎng)站的頭、尾區(qū)塊可以各自定義為一個(gè)模板,之后將它們放在每一個(gè)頁(yè)面模板的上、下位置。

最后,根據(jù)你選擇的類庫(kù),模板可以通過(guò)自動(dòng)轉(zhuǎn)義用戶的內(nèi)容,從而帶來(lái)更多的安全性。有些類庫(kù)甚至提供沙箱機(jī)制,模板設(shè)計(jì)者只能使用在白名單中的變量和函數(shù)。

原生 PHP 模板

原生 PHP 模板就是指直接用 PHP 來(lái)寫(xiě)模板,這是很自然的選擇,因?yàn)?PHP 本身其實(shí)是個(gè)模板語(yǔ)言。這代表你可以在其他的語(yǔ)言中結(jié)合 PHP 使用,比如 HTML 。這對(duì) PHP 開(kāi)發(fā)者相當(dāng)有利,因?yàn)椴恍枰~外學(xué)習(xí)新的語(yǔ)法,他們熟知可以使用的函數(shù),并且使用的編輯器也已經(jīng)內(nèi)置了語(yǔ)法高亮和自動(dòng)補(bǔ)全。此外,原生的 PHP 模板沒(méi)有了編譯階段,速度會(huì)更快。

現(xiàn)今的 PHP 框架都會(huì)使用一些模板系統(tǒng),這當(dāng)中多數(shù)是使用原生的 PHP 語(yǔ)法。在框架之外,一些類庫(kù)比如 PlatesAura.View,提供了現(xiàn)代化模板的常見(jiàn)功能,比如繼承、布局、擴(kuò)展,讓原生的 PHP 模板更容易使用。

原生 PHP 模板的簡(jiǎn)單示例

使用 Plates 類庫(kù)。

{% highlight php %}
<?php // user_profile.php ?>

<?php $this->insert('header', ['title' => 'User Profile']) ?>

<h1>User Profile</h1>
<p>Hello, <?=$this->escape($name)?></p>

<?php $this->insert('footer') ?>
{% endhighlight %}

原生 PHP 模板使用繼承的示例

使用 Plates 類庫(kù)。

{% highlight php %}
<?php // template.php ?>

<html>
<head>
    <title><?=$title?></title>
</head>
<body>

<main>
    <?=$this->section('content')?>
</main>

</body>
</html>
{% endhighlight %}

{% highlight php %}
<?php // user_profile.php ?>

<?php $this->layout('template', ['title' => 'User Profile']) ?>

<h1>User Profile</h1>
<p>Hello, <?=$this->escape($name)?></p>
{% endhighlight %}

編譯模板

盡管 PHP 不斷升級(jí)為成熟的、面向?qū)ο蟮恼Z(yǔ)言,但它作為模板語(yǔ)言 沒(méi)有改善多少。編譯模板,比如 TwigSmarty* ,提供了模板專用的新語(yǔ)法,填補(bǔ)了這片空白。從自動(dòng)轉(zhuǎn)義到繼承以及簡(jiǎn)化控制結(jié)構(gòu),編譯模板設(shè)計(jì)地更容易編寫(xiě),可讀性更高,同時(shí)使用上也更加的安全。編譯模板甚至可以在不同的語(yǔ)言中使用,Mustache 就是一個(gè)很好的例子。由于這些模板需要編譯,在性能上會(huì)帶來(lái)一些輕微的影響,不過(guò)如果適當(dāng)?shù)氖褂镁彺?,影響就變得非常小了?/p>

*雖然 Smarty 提供了自動(dòng)轉(zhuǎn)義的功能, 不過(guò)這個(gè)功能默認(rèn)是關(guān)閉的

編譯模板簡(jiǎn)單示例

使用 Twig 類庫(kù)。

{% highlight html+jinja %}
{% raw %}
{% include 'header.html' with {'title': 'User Profile'} %}

<h1>User Profile</h1>
<p>Hello, {{ name }}</p>

{% include 'footer.html' %}
{% endraw %}
{% endhighlight %}

編譯模板使用繼承示例

使用 Twig 類庫(kù)。

{% highlight html+jinja %}
{% raw %}
// template.html

<html>
<head>
    <title>{% block title %}{% endblock %}</title>
</head>
<body>

<main>
    {% block content %}{% endblock %}
</main>

</body>
</html>
{% endraw %}
{% endhighlight %}

{% highlight html+jinja %}
{% raw %}
// user_profile.html

{% extends "template.html" %}

{% block title %}User Profile{% endblock %}
{% block content %}
    <h1>User Profile</h1>
    <p>Hello, {{ name }}</p>
{% endblock %}
{% endraw %}
{% endhighlight %}

延伸閱讀

文章與教程

類庫(kù)