Twig模板引擎设计指南:从入门到精通
概述
Twig是一款灵活、安全且高效的PHP模板引擎,专为模板设计师打造。它采用简洁的语法结构,将业务逻辑与展示层清晰分离,使前端开发更加高效规范。本文将全面解析Twig的核心概念和使用技巧。
基础模板结构
Twig模板是标准的文本文件,可生成HTML、XML、CSV等多种文本格式。模板文件扩展名无特殊要求,.html
或.xml
都是常见选择。
模板包含两大核心元素:
- 变量/表达式:在模板渲染时会被替换为实际值
- 标签:控制模板的逻辑流程
示例模板:
<!DOCTYPE html>
<html>
<head>
<title>My Webpage</title>
</head>
<body>
<ul id="navigation">
{% for item in navigation %}
<li><a href="{{ item.href }}">{{ item.caption }}</a></li>
{% endfor %}
</ul>
<h1>My Webpage</h1>
{{ a_variable }}
</body>
</html>
Twig使用两种定界符:
{% ... %}
用于执行语句(如循环、条件判断){{ ... }}
用于输出表达式结果
开发工具支持
主流IDE对Twig提供良好支持:
- 语法高亮:Textmate、Vim、Netbeans、PhpStorm等
- 代码补全:Eclipse、Sublime Text等
- 静态分析:TwigStan、TwigQI等工具可检测模板中的潜在问题
变量系统
变量类型
Twig抽象了PHP类型系统,支持以下基本类型:
| Twig类型 | 对应PHP类型 | |----------------|--------------------------| | string | 字符串或可字符串化对象 | | number | 整数或浮点数 | | boolean | true/false | | null | null | | iterable | 数组或可迭代对象 | | object | 普通对象 |
变量访问
使用点号(.)访问对象属性或数组元素:
{{ user.name }}
当变量不存在时,行为取决于strict_variables
配置:
false
:返回nulltrue
:抛出异常
全局变量
模板中始终可用的变量:
_self
:当前模板名_context
:当前上下文_charset
:当前字符集
变量赋值
使用set
标签创建变量:
{% set name = 'Fabien' %}
{% set numbers = [1, 2] %}
{% set map = {'city': 'Paris'} %}
数据处理
过滤器(Filter)
过滤器用于修改变量或表达式,通过管道符(|)连接:
基础用法:
{{ name|striptags|title }}
带参数过滤器:
{{ list|join(', ') }}
代码块应用过滤器:
{% apply upper %}
This text becomes uppercase
{% endapply %}
函数(Function)
函数用于生成内容,通过函数名加括号调用:
{% for i in range(0, 3) %}
{{ i }},
{% endfor %}
命名参数
Twig 3.15+支持命名参数,提高代码可读性:
{{ data|convert_encoding(from: 'iso-2022-jp', to: 'UTF-8') }}
混合使用位置参数和命名参数时,位置参数必须在前:
{{ "now"|date('d/m/Y H:i', timezone: "Europe/Paris") }}
流程控制
条件语句
{% if users|length > 0 %}
<ul>
{% for user in users %}
<li>{{ user.username|e }}</li>
{% endfor %}
</ul>
{% endif %}
循环语句
<h1>Members</h1>
<ul>
{% for user in users %}
<li>{{ user.username|e }}</li>
{% endfor %}
</ul>
注释系统
块注释:
{# 这是一个多行注释
可以包含多行内容
#}
行内注释(Twig 3.15+):
{{
# 这是行内注释
"Hello World"|upper
}}
模板组织
包含模板
{{ include('sidebar.html.twig') }}
包含的模板可以访问当前上下文的所有变量。
模板继承
Twig最强大的功能是模板继承,允许创建基础模板骨架:
基础模板(base.html.twig):
<!DOCTYPE html>
<html>
<head>
{% block head %}
<link rel="stylesheet" href="style.css"/>
<title>{% block title %}{% endblock %} - My Webpage</title>
{% endblock %}
</head>
<body>
<div id="content">{% block content %}{% endblock %}</div>
</body>
</html>
子模板:
{% extends "base.html.twig" %}
{% block title %}Index{% endblock %}
{% block content %}
<h1>Index</h1>
<p>Welcome to my homepage.</p>
{% endblock %}
使用parent()
函数可引用父模板块内容。
安全防护
HTML转义
Twig默认启用自动转义,策略可通过autoescape
选项配置。
手动转义:
{{ user.username|e }}
{{ user.username|e('js') }} {# 指定转义策略 #}
自动转义块:
{% autoescape 'js' %}
{# 此块内内容自动使用JS转义策略 #}
{% endautoescape %}
原始输出
输出Twig定界符作为普通文本:
{{ '{{' }}
大段原始内容使用verbatim
标签:
{% verbatim %}
{{ 这里的内容不会被Twig解析 }}
{% endverbatim %}
高级特性
宏(Macro)
类似编程语言中的函数,用于复用HTML片段:
{% macro input(name, value, type = "text") %}
<input type="{{ type }}" name="{{ name }}" value="{{ value }}"/>
{% endmacro %}
表达式
Twig支持丰富的表达式语法,包括:
- 字符串:"Hello World"
- 数字:42 或 42.23(支持
_
分隔符:-3_141.592_65) - 数组:["first_name", "last_name"]
字符串转义规则:
- 特殊字符:\n(换行)、\t(制表符)等
- 单引号字符串中的单引号:'
- 双引号字符串中的双引号:"
- 路径中的反斜线:\
通过掌握这些核心概念,开发者可以充分利用Twig构建可维护、安全且高效的模板系统。Twig的简洁语法和强大功能使其成为PHP生态中最受欢迎的模板引擎之一。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考