首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Twig 模板引擎標籤完全指南(三):安全輸出與特殊標籤

     編輯:PHP 相關知識

本系列最終篇,涵蓋 Twig 安全輸出控制(autoescape、raw)、串流輸出(flush)、表達式執行(do)等特殊標籤,並附上完整過濾器與函數快速參考表。

一、autoescape 自動轉義控制

Twig 預設啟用自動轉義(HTML 語境),將 & < > ' " 轉為實體。autoescape 標籤可區域性控制策略。

語法

{% autoescape true %}   {# 啟用 HTML 轉義(預設) #}
{% autoescape false %}  {# 關閉自動轉義 #}
{% autoescape 'js' %}   {# JavaScript 語境轉義 #}
{% autoescape 'css' %}  {# CSS 語境轉義 #}
{% autoescape 'url' %}  {# URL 語境轉義 #}
{% endautoescape %}

範例

{% autoescape true %}
    {{ variable }} {# 會被 HTML 轉義 #}
    {{ safe_html|raw }} {# raw 標記跳過轉義 #}
{% endautoescape %}

{% autoescape 'js' %}
    var msg = "{{ user_input }}"; {# 會轉義為 JS 字串安全格式 #}
{% endautoescape %}

注意事項

  • Twig 函數回傳值(parent()、block()、macro 呼叫)標記為「安全」,不會被再次轉義
  • autoescape 僅影響區塊內直接輸出 的變數
  • 策略名稱:html(預設)、js、css、url、html_attr

二、raw 禁用轉義標籤

標記區塊內容為「已安全」,完全跳過模板引擎解析與轉義。

{% raw %}
    <ul>
    {% for item in seq %}
        <li>{{ item }}</li> {# 這裡的 {{ }} 會原樣輸出,不被解析 #}
    {% endfor %}
    </ul>
{% endraw %}

常用於:展示程式碼片段、輸出包含 Twig 語法的文字、前端模板(Vue/React)共存頁面。

三、flush 串流刷新輸出

Twig 1.5+ 新增。呼叫 PHP flush() 將輸出緩衝區送至瀏覽器,適用於長時間執行的頁面漸進式渲染。

<html>
<head><title>Large Page</title></head>
<body>
    {% include 'header.twig' %}
    {% flush %} {# 先送出 header,使用者較快看到內容 #}
    
    {% for item in large_dataset %}
        {{ item.render() }}
    {% endfor %}
    
    {% include 'footer.twig' %}
</body>
</html>

四、do 執行表達式不輸出

Twig 1.5+ 新增。類似 {{ ... }} 但不輸出結果,用於執行有副作用的表達式(如陣列操作、設定變數、呼叫無回傳值方法)。

{% do navigation.addItem('Home', '/') %}
{% do form.setErrors(errors) %}
{% do 1 + 2 %} {# 無意義但合法 #}

五、完整過濾器快速參考

過濾器功能範例
date格式化日期{{ post.published_at|date("Y-m-d") }}
formatsprintf 風格格式化{{ "I like %s"|format(foo) }}
replace字串替換{{ "a,b"|replace({',': ';'}) }}
number_format數字格式化{{ 1234.5|number_format(2, '.', ',') }}
url_encodeURL 編碼{{ data|url_encode }}
json_encodeJSON 編碼{{ data|json_encode }}
convert_encoding編碼轉換{{ data|convert_encoding('UTF-8', 'ISO-2022-JP') }}
title每單字首字大寫{{ 'my car'|title }} → My Car
capitalize首字大寫其餘小寫{{ 'MY CAR'|capitalize }} → My car
nl2br換行轉 <br>{{ text|nl2br }}
upper/lower大/小寫轉換{{ name|upper }}
striptags移除 HTML 標籤{{ html|striptags }}
join陣列串接{{ [1,2,3]|join('|') }} → 1|2|3
reverse反轉陣列/可迭代物件{% for u in users|reverse %}
length陣列/字串長度{% if users|length > 10 %}
sort排序陣列{% for u in users|sort %}
default預設值{{ var|default('N/A') }}
keys取得陣列鍵名{% for k in arr|keys %}
escape/eHTML 轉義{{ name|e }}、{{ name|escape('js') }}
raw標記為安全{{ safe|raw }}
merge合併陣列/關聯陣列{{ {'a':1}|merge({'b':2}) }}

六、完整內建函數快速參考

函數功能範例
attribute動態存取屬性/方法{{ attribute(obj, method, args) }}
block輸出區塊內容{{ block('title') }}
constant讀取常數{{ constant('DATE_W3C') }}
cycle循環取值{{ cycle(['odd','even'], i) }}
dump除錯輸出 (需 Debug 擴充){{ dump(var) }}、{{ dump() }}
parent父區塊內容{{ parent() }}
random隨機取值{{ random(['a','b','c']) }}
range產生數字範圍陣列{{ range(0, 3) }} → [0,1,2,3]

七、Twig 開發最佳實務摘要

  1. 預設開啟 autoescape,僅在確信安全時用 |raw
  2. 業務邏輯留在控制器,模板僅做呈現
  3. 善用模板繼承,避免大量 include 造成碎片化
  4. 巨集封裝重複 UI(表單、卡片、分頁)
  5. 複雜資料處理用 PHP,不要在模板寫複雜邏輯
  6. 啟用快取:new Twig\Environment($loader, ['cache' => '/path/to/cache'])
  7. 嚴格變數模式:['strict_variables' => true] 開發期捕獲拼字錯誤
  8. 自動重新編譯:['auto_reload' => true] 開發期自動偵測模板變更

系列總結

三篇文章完整涵蓋 Twig 所有核心標籤:

  • 第一部分:for、if、macro、import/from、filter
  • 第二部分:set、extends/block、include、use、spaceless
  • 第三部分:autoescape、raw、flush、do、完整過濾器/函數參考

掌握這些功能,即可充分發揮 Twig 的表達力與安全性,構建可維護、高效能的現代 PHP 應用視圖層。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved