Twig 是 Symfony 專案孵化的現代 PHP 模板引擎,以「快速、安全、靈活」著稱。編譯為優化 PHP 代碼效能損耗極低;沙箱模式保障非受信模板安全;靈活的語法解析器支援自定義標籤、過濾器、函數與 DSL。本文涵蓋安裝方式、核心 API 用法、檔案系統載入器與快取配置。
git clone git://github.com/fabpot/Twig.gitcomposer require "twig/twig:^3.0"pear channel-discover pear.twig-project.org && pear install twig/Twig<?php
require_once '/path/to/vendor/autoload.php'; // Composer 自動載入
$loader = new \Twig\Loader\ArrayLoader([
'index' => 'Hello {{ name }}!',
]);
$twig = new \Twig\Environment($loader);
echo $twig->render('index', ['name' => 'Fabien']); // Hello Fabien!
<?php
require_once '/path/to/vendor/autoload.php';
$loader = new \Twig\Loader\FilesystemLoader('/path/to/templates');
$twig = new \Twig\Environment($loader, [
'cache' => '/path/to/compilation_cache', // 啟用快取,生產環境必須
'debug' => true,
'auto_reload' => true, // 開發環境自動重新編譯
'strict_variables' => true, // 未定義變數拋異常
]);
$template = $twig->load('index.html.twig');
echo $template->render(['title' => '首頁', 'items' => $items]);
| 語法 | 說明 | 範例 |
|---|---|---|
{{ var }} | 輸出變數(自動 HTML 轉義) | {{ user.name }} |
{% if %}...{% endif %} | 條件判斷 | {% if user.active %}...{% endif %} |
{% for item in items %}...{% endfor %} | 迴圈 | {% for p in posts %}{{ p.title }}{% endfor %} |
{% extends 'base.html.twig' %} | 模板繼承 | 子模板覆寫區塊 |
{% block content %}...{% endblock %} | 定義可覆寫區塊 | 父模板預留位置 |
{{ var|filter }} | 過濾器管道 | {{ name|upper|escape }} |
{{ function() }} | 函數呼叫 | {{ path('home') }} |
{% include 'partial.html.twig' %} | 引入局部模板 | 複用片段 |
base.html.twig<!DOCTYPE html>
<html>
<head>
<title>{% block title %}預設標題{% endblock %}</title>
{% block stylesheets %}{% endblock %}
</head>
<body>
<header>{% block header %}網站標頭{% endblock %}</header>
<main>{% block content %}{% endblock %}</main>
<footer>{% block footer %}版權所有{% endblock %}</footer>
{% block javascripts %}{% endblock %}
</body>
</html>
article.html.twig{% extends 'base.html.twig' %}
{% block title %}{{ article.title }} - 我的部落格{% endblock %}
{% block content %}
<article>
<h1>{{ article.title }}</h1>
<div class="meta">發布於 {{ article.published_at|date('Y-m-d') }}</div>
<div class="body">{{ article.content|raw }}</div>
</article>
{% endblock %}
<?php
$twig = new \Twig\Environment($loader);
$twig->addFilter(new \Twig\TwigFilter('price', function ($number, $currency = 'TWD') {
return number_format($number, 0) . ' ' . $currency;
}));
$twig->addFunction(new \Twig\TwigFunction('asset', function ($path) {
return '/assets/' . ltrim($path, '/');
}));
$twig->addGlobal('site_name', 'My Awesome Site');
// 進階:自定義 Tag 需實作 TokenParser 與 Node 類別
application/third_party/Twig/application/libraries/Twig.php 建立薄封裝(參考「CodeIgniter 整合第三方類庫實戰」一文)application/config/twig.php 管理模板路徑、快取目錄、副檔名.twig 結尾,享受自動轉義、繼承、區塊等現代模板特性Twig 以優雅語法、編譯優化、沙箱安全三大特性,成為現代 PHP 專案模板層的首選。掌握核心 API、檔案載入器、快取策略與自定義擴展,即可在任何框架(或無框架)專案中輕鬆落地。