Twig模板引擎设计指南:从入门到精通

Twig模板引擎设计指南:从入门到精通

Twig Twig, the flexible, fast, and secure template language for PHP Twig 项目地址: https://gitcode.com/gh_mirrors/tw/Twig

概述

Twig是一款灵活、安全且高效的PHP模板引擎,专为模板设计师打造。它采用简洁的语法结构,将业务逻辑与展示层清晰分离,使前端开发更加高效规范。本文将全面解析Twig的核心概念和使用技巧。

基础模板结构

Twig模板是标准的文本文件,可生成HTML、XML、CSV等多种文本格式。模板文件扩展名无特殊要求,.html.xml都是常见选择。

模板包含两大核心元素:

  1. 变量/表达式:在模板渲染时会被替换为实际值
  2. 标签:控制模板的逻辑流程

示例模板:

<!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:返回null
  • true:抛出异常

全局变量

模板中始终可用的变量:

  • _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生态中最受欢迎的模板引擎之一。

Twig Twig, the flexible, fast, and secure template language for PHP Twig 项目地址: https://gitcode.com/gh_mirrors/tw/Twig

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龚盼韬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值