使用樣板
樣板提供簡便的方式,將展現邏輯從控制器與業務邏輯中分離出來。
一般而言,樣板包含了應用程式的HTML,但也可以套用在其他的格式上,例如XML。
樣板通常也被當作「視圖」, 而它是 模型-視圖-控制器 (MVC) 軟體架構模式第二個元素的一部份。
好處
使用樣板的主要好處是可以將展現邏輯與應用程式的其他部份明確分離。樣板的唯一責任便是顯示轉化過的內容。它不負責查詢、保存資料或是其他複雜的任務。這促成了更乾淨、更具可讀性的程式碼,在開發者專注伺服器端程式(控制器、模型),而設計師負責用戶端程式(網頁標記)的團隊協作環境中,樣板導入尤其有用。
樣板同時也改善了前端程式碼的組織架構。一般而言,樣板放置在「視圖」的資料夾中,每個樣板定義在各自獨立的檔案中。這種方式鼓勵程式碼重用,它將大區塊的程式碼分為較小、可重用的段落,通常稱作局部樣板 (partials) 。舉例來說,網站的頭、尾區塊可以各自定義為樣板,之後將它們置於每一個頁面樣板的上、下位置。
最後,端視你所使用的函式庫,樣板可以透過自動逸脫使用者產出內容,帶來更多的安全性。有些函式庫甚至提供沙箱機制,樣板設計師只能使用在白名單中的變數和函式。
原生 PHP 樣板
原生 PHP 樣板是直接拿 PHP 來寫樣板。這是很直覺的選擇,因為 PHP 事實上就是個樣板語言。這代表你可以在其他的語言中結合 PHP 使用,像是 HTML。這對 PHP 開發者相當有利,不需要額外學習新的語法,他們熟知可以使用的函式,所使用的編輯器也已經內建語法高亮和自動補完。此外,原生 PHP 樣板少了編譯階段,速度更快。
現今的 PHP 框架都會使用一些樣板系統,這當中多數預設使用原生的 PHP 語法。在框架之外,一些函式庫如 Plates 或 Aura.View ,提供現今樣板常見功能,像是繼承、佈局、擴充套件等,讓原生PHP樣板更容易使用。
原生 PHP 樣板的範例
使用 Plates 函式。
<?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') ?>
原生 PHP 樣板使用繼承的範例
使用 Plates 函式。
<?php // template.php ?>
<html>
<head>
<title><?=$title?></title>
</head>
<body>
<main>
<?=$this->section('content')?>
</main>
</body>
</html>
<?php // user_profile.php ?>
<?php $this->layout('template', ['title' => 'User Profile']) ?>
<h1>User Profile</h1>
<p>Hello, <?=$this->escape($name)?></p>
編譯樣板
PHP 不斷進化為成熟、物件導向的語言,但它作為樣板語言沒有改善多少。編譯樣板,像是 Twig 或 Smarty*,提供樣板專用的新語法,補足了這片空白。從自動逸脫到繼承以及簡化控制結構,編譯樣板設計地更容易撰寫、可讀性更高、使用上更為安全。編譯樣板更能在不同的語言中使用,Mustache 就是一個極佳例子。由於這些樣板需要編譯,在效能方面會帶來些許影響,不過如果適當使用快取,影響就十分有限。
*雖然 Smarty 提供自動逸脫機制,不過這個功能並非預設啟用。
編譯樣板範例
使用 Twig 函式庫。
<h1>User Profile</h1>
<p>Hello, {{ name }}</p>
編譯模例使用繼承的範例
使用 Twig 函式庫。
// template.php
// user_profile.php
<h1>User Profile</h1>
<p>Hello, {{ name }}</p>
延伸閱讀
文章與指南
- Templating Engines in PHP
- An Introduction to Views & Templating in CodeIgniter
- Getting Started With PHP Templating
- Roll Your Own Templating System in PHP
- Master Pages
- Working With Templates in Symfony 2