搜索
首页后端开发php教程树枝 - 最受欢迎的独立PHP模板引擎

Twig - the Most Popular Stand-Alone PHP Template Engine

Twig:一款流行的PHP模板引擎

Twig是由Sensio Labs开发的PHP流行模板引擎,它简化了PHP代码,并增加了安全和调试等功能。Twig同时作用于项目的frontend和backend,可以从两个角度来看:模板设计师的Twig和开发者的Twig。Twig使用名为Environment的核心对象来存储配置、扩展,并从文件系统或其他位置加载模板。Twig支持嵌套模板(块),避免模板中元素重复,并能缓存编译后的模板以加快后续请求速度。Twig支持条件语句、循环和过滤器来控制模板中信息的显示,并提供调试功能来转储模板变量的所有信息。

本文由Wern Ancheta同行评审。感谢所有SitePoint的同行评审员,使SitePoint的内容达到最佳状态!


Twig是PHP的模板引擎。但是,PHP本身不是模板引擎吗?是的,也不是!尽管PHP最初是作为模板引擎,但它的发展并非如此,虽然我们仍然可以将其用作模板引擎,请问您更喜欢哪个版本的“Hello world”:

<?php echo "<p> Hello " . $name . "</p>"; ?>

还是

<p>Hello {{ name }}</p>

PHP是一种冗长的语言,在尝试输出HTML内容时,这种冗长性会被放大。现代模板系统将消除部分冗长性,并在其之上增加相当多的功能。诸如安全和调试功能之类的特性是现代模板引擎的支柱。今天,我们将重点介绍Twig。

Twig - the Most Popular Stand-Alone PHP Template Engine

Twig是由Sensio Labs(Blackfire和Symfony的开发公司)创建的模板引擎。让我们来看看它的主要优势以及如何在项目中使用它。

安装

安装Twig有两种方法。我们可以使用其网站上提供的tar包,或者像我们一直做的那样,使用Composer。

composer require twig/twig

我们假设您正在运行已设置PHP并全局安装Composer的环境。最好的方法是使用Homestead Improved——它可以让您在5分钟内在与我们使用的完全相同的机器上开始使用,这样我们就能在同一页面上。如果您想了解有关PHP环境的更多信息,我们这里有一本关于此的优秀付费书籍可供购买。

在我们继续之前,我们需要先澄清一些事情。作为模板引擎,Twig同时作用于项目的frontend和backend。因此,我们可以从两个不同的角度来看待Twig:模板设计师的Twig和开发者的Twig。一方面,我们准备所有需要的数据;另一方面,我们呈现所有这些数据。

基本用法

为了举例说明Twig的基本用法,让我们创建一个简单的项目。首先,我们需要引导Twig。让我们创建一个包含以下内容的bootstrap.php文件:

<?php echo "<p> Hello " . $name . "</p>"; ?>

Twig使用名为Environment的核心对象。此类的实例用于存储配置、扩展,并从文件系统或其他位置加载模板。在我们的Twig实例引导后,我们可以继续创建一个index.php文件,在其中加载一些数据并将其传递给Twig模板。

<p>Hello {{ name }}</p>

这是一个简单的示例;我们正在创建一个包含产品的数组,例如我们的机械键盘,我们可以在模板中使用它。然后,我们使用render()方法,它接受模板名称(这是我们之前定义的模板文件夹中的一个文件)以及我们要传递给模板的数据。为了完成我们的示例,让我们进入我们的/templates文件夹并创建一个index.html文件。首先,让我们看看模板本身。

composer require twig/twig

在浏览器中打开index.php(访问localhost或homestead.app,具体取决于您如何设置主机和服务器)现在应该会显示以下屏幕:

Twig - the Most Popular Stand-Alone PHP Template Engine

但是让我们回到并仔细看看我们的模板代码。有两种类型的分隔符:{{ ... }}用于打印表达式或操作的结果,而{% ... %}用于执行诸如条件语句和循环之类的语句。这些分隔符是Twig的主要语言结构,Twig使用它们来“告知”模板它必须呈现Twig元素。

(以下内容与原文类似,但做了部分语句调整和段落划分,并保持了图片位置不变)

布局

为了避免在模板中重复元素(如页眉和页脚),Twig允许我们将模板嵌套在模板中,这些被称为块。为了举例说明这一点,让我们将实际内容与示例中的HTML定义分开。让我们创建一个新的HTML文件并将其命名为layout.html

<?php
// 加载我们的自动加载器
require_once __DIR__.'/vendor/autoload.php';

// 指定我们的Twig模板位置
$loader = new Twig_Loader_Filesystem(__DIR__.'/templates');

// 实例化我们的Twig
$twig = new Twig_Environment($loader);

我们创建了一个名为content的块。我们的意思是,每个从layout.html扩展的模板都可以实现一个content块,该块将显示在该位置。这样,我们可以多次重用布局而无需重写它。在本例中,index.html文件现在如下所示:

<?php
require_once __DIR__.'/bootstrap.php';

// 创建产品列表
$products = [
    [
        'name'          => 'Notebook',
        'description'   => 'Core i7',
        'value'         =>  800.00,
        'date_register' => '2017-06-22',
    ],
    [
        'name'          => 'Mouse',
        'description'   => 'Razer',
        'value'         =>  125.00,
        'date_register' => '2017-10-25',
    ],
    [
        'name'          => 'Keyboard',
        'description'   => 'Mechanical Keyboard',
        'value'         =>  250.00,
        'date_register' => '2017-06-23',
    ],
];

// 渲染我们的视图
echo $twig->render('index.html', ['products' => $products] );

Twig还允许我们只渲染单个块。为此,我们需要首先加载模板,然后渲染块。

<!DOCTYPE html>
<html lang="pt-BR">
    <head>
        <meta charset="UTF-8">
        <title>Twig Example</title>
    </head>
    <body>
    <table> border="1" style="width: 80%;">
        <thead>
            <tr>
                <td>Product</td>
                <td>Description</td>
                <td>Value</td>
                <td>Date</td>
            </tr>
        </thead>
        <tbody>
            {% for product in products %}
                <tr>
                    <td>{{ product.name }}</td>
                    <td>{{ product.description }}</td>
                    <td>{{ product.value }}</td>
                    <td>{{ product.date_register|date("m/d/Y") }}</td>
                </tr>
            {% endfor %}
        </tbody>
    </table>
    </body>
</html>

此时,我们仍然拥有相同的页面,但我们通过分离上下文块来降低了它的复杂性。

缓存

Environment对象不仅可以用于加载模板。如果我们使用关联目录的cache选项传递,Twig将缓存编译后的模板,从而避免在后续请求中解析模板。编译后的模板将存储在我们提供的目录中。请注意,这是编译模板的缓存,而不是已评估的模板的缓存。这意味着Twig将解析、编译并保存模板文件。所有后续请求仍然需要评估模板,但第一步已经为您完成。让我们通过编辑bootstrap.php文件来缓存示例中的模板:

<?php echo "<p> Hello " . $name . "</p>"; ?>

(以下内容与原文类似,但做了部分语句调整和段落划分,并保持了图片位置不变)

循环

在我们的示例中,我们已经看到了如何使用Twig进行循环。基本上,我们使用for标签并为指定数组中的每个元素分配一个别名。在本例中,我们为products数组分配了别名product。之后,我们可以使用.运算符访问每个数组元素中的所有属性。我们使用endfor标签来指示循环的结束。我们还可以使用..运算符循环遍历数字或字母。如下所示:

<p>Hello {{ name }}</p>

或字母:

composer require twig/twig

此运算符只是range函数的语法糖,其工作方式与本机PHPrange函数相同。同样有用的选项是向循环添加条件。使用条件,我们可以过滤要迭代的元素。假设我们想要迭代所有值小于250的产品:

<?php
// 加载我们的自动加载器
require_once __DIR__.'/vendor/autoload.php';

// 指定我们的Twig模板位置
$loader = new Twig_Loader_Filesystem(__DIR__.'/templates');

// 实例化我们的Twig
$twig = new Twig_Environment($loader);

条件语句

Twig还以ifelseifif notelse标签的形式提供条件语句。就像在任何编程语言中一样,我们可以使用这些标签来过滤模板中的条件。假设在我们的示例中,我们只想显示值高于500的产品:

<?php
require_once __DIR__.'/bootstrap.php';

// 创建产品列表
$products = [
    [
        'name'          => 'Notebook',
        'description'   => 'Core i7',
        'value'         =>  800.00,
        'date_register' => '2017-06-22',
    ],
    [
        'name'          => 'Mouse',
        'description'   => 'Razer',
        'value'         =>  125.00,
        'date_register' => '2017-10-25',
    ],
    [
        'name'          => 'Keyboard',
        'description'   => 'Mechanical Keyboard',
        'value'         =>  250.00,
        'date_register' => '2017-06-23',
    ],
];

// 渲染我们的视图
echo $twig->render('index.html', ['products' => $products] );

过滤器

过滤器允许我们过滤传递给模板的信息以及显示信息的格式。让我们看看一些最常用和最重要的过滤器。Twig过滤器的完整列表可以在这里找到。

日期和date_modify

date过滤器将日期格式化为给定格式。正如我们在示例中看到的:

<!DOCTYPE html>
<html lang="pt-BR">
    <head>
        <meta charset="UTF-8">
        <title>Twig Example</title>
    </head>
    <body>
    <table> border="1" style="width: 80%;">
        <thead>
            <tr>
                <td>Product</td>
                <td>Description</td>
                <td>Value</td>
                <td>Date</td>
            </tr>
        </thead>
        <tbody>
            {% for product in products %}
                <tr>
                    <td>{{ product.name }}</td>
                    <td>{{ product.description }}</td>
                    <td>{{ product.value }}</td>
                    <td>{{ product.date_register|date("m/d/Y") }}</td>
                </tr>
            {% endfor %}
        </tbody>
    </table>
    </body>
</html>

我们以月/日/年的格式显示日期。除了date过滤器之外,我们还可以使用修饰符字符串使用date_modify过滤器更改日期。例如,如果我们想向日期添加一天,我们可以使用以下内容:

<!DOCTYPE html>
<html lang="pt-BR">
    <head>
        <meta charset="UTF-8">
        <title>Tutorial Example</title>
    </head>
    <body>
        {% block content %}
        {% endblock %}
    </body>
</html>

format

通过替换所有占位符来格式化给定字符串。例如:

{% extends "layout.html" %}

{% block content %}
    <table> border="1" style="width: 80%;">
        <thead>
            <tr>
                <td>Product</td>
                <td>Description</td>
                <td>Value</td>
                <td>Date</td>
            </tr>
        </thead>
        <tbody>
            {% for product in products %}
                <tr>
                    <td>{{ product.name }}</td>
                    <td>{{ product.description }}</td>
                    <td>{{ product.value }}</td>
                    <td>{{ product.date_register|date("m/d/Y") }}</td>
                </tr>
            {% endfor %}
        </tbody>
    </table>
{% endblock %}

striptags

striptags过滤器去除SGML/XML标签,并将相邻的空格替换为空格:

<?php echo "<p> Hello " . $name . "</p>"; ?>

escape

escape是最重要的过滤器之一。它过滤字符串以安全地插入最终输出中。默认情况下,它使用HTML转义策略,因此

<p>Hello {{ name }}</p>

等效于

composer require twig/twig

jscssurlhtml_attr转义策略也可使用。它们分别为Javascript、CSS、URI和HTML属性上下文转义字符串。

调试

最后,让我们来看看调试。有时我们需要访问模板变量的所有信息。为此,Twig具有dump()函数。此函数默认情况下不可用。在创建Twig环境时,我们必须添加Twig_Extension_Debug扩展:

<?php
// 加载我们的自动加载器
require_once __DIR__.'/vendor/autoload.php';

// 指定我们的Twig模板位置
$loader = new Twig_Loader_Filesystem(__DIR__.'/templates');

// 实例化我们的Twig
$twig = new Twig_Environment($loader);

此步骤是必要的,这样我们才不会意外地在生产服务器上泄露调试信息。配置完成后,我们只需使用dump()函数即可转储有关模板变量的所有信息。

<?php
require_once __DIR__.'/bootstrap.php';

// 创建产品列表
$products = [
    [
        'name'          => 'Notebook',
        'description'   => 'Core i7',
        'value'         =>  800.00,
        'date_register' => '2017-06-22',
    ],
    [
        'name'          => 'Mouse',
        'description'   => 'Razer',
        'value'         =>  125.00,
        'date_register' => '2017-10-25',
    ],
    [
        'name'          => 'Keyboard',
        'description'   => 'Mechanical Keyboard',
        'value'         =>  250.00,
        'date_register' => '2017-06-23',
    ],
];

// 渲染我们的视图
echo $twig->render('index.html', ['products' => $products] );

结论

希望本文能为您提供Twig基础知识的坚实基础,并立即启动您的项目!如果您想更深入地了解Twig,官方网站提供了您可以查阅的非常好的文档和参考。您使用模板引擎吗?您对Twig有什么看法?您会将它与Blade或Smarty等流行的替代方案进行比较吗?

(以下内容为FAQ,原文已包含,此处略去)

以上是树枝 - 最受欢迎的独立PHP模板引擎的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
PHP的当前状态:查看网络开发趋势PHP的当前状态:查看网络开发趋势Apr 13, 2025 am 12:20 AM

PHP在现代Web开发中仍然重要,尤其在内容管理和电子商务平台。1)PHP拥有丰富的生态系统和强大框架支持,如Laravel和Symfony。2)性能优化可通过OPcache和Nginx实现。3)PHP8.0引入JIT编译器,提升性能。4)云原生应用通过Docker和Kubernetes部署,提高灵活性和可扩展性。

PHP与其他语言:比较PHP与其他语言:比较Apr 13, 2025 am 12:19 AM

PHP适合web开发,特别是在快速开发和处理动态内容方面表现出色,但不擅长数据科学和企业级应用。与Python相比,PHP在web开发中更具优势,但在数据科学领域不如Python;与Java相比,PHP在企业级应用中表现较差,但在web开发中更灵活;与JavaScript相比,PHP在后端开发中更简洁,但在前端开发中不如JavaScript。

PHP与Python:核心功能PHP与Python:核心功能Apr 13, 2025 am 12:16 AM

PHP和Python各有优势,适合不同场景。1.PHP适用于web开发,提供内置web服务器和丰富函数库。2.Python适合数据科学和机器学习,语法简洁且有强大标准库。选择时应根据项目需求决定。

PHP:网络开发的关键语言PHP:网络开发的关键语言Apr 13, 2025 am 12:08 AM

PHP是一种广泛应用于服务器端的脚本语言,特别适合web开发。1.PHP可以嵌入HTML,处理HTTP请求和响应,支持多种数据库。2.PHP用于生成动态网页内容,处理表单数据,访问数据库等,具有强大的社区支持和开源资源。3.PHP是解释型语言,执行过程包括词法分析、语法分析、编译和执行。4.PHP可以与MySQL结合用于用户注册系统等高级应用。5.调试PHP时,可使用error_reporting()和var_dump()等函数。6.优化PHP代码可通过缓存机制、优化数据库查询和使用内置函数。7

PHP:许多网站的基础PHP:许多网站的基础Apr 13, 2025 am 12:07 AM

PHP成为许多网站首选技术栈的原因包括其易用性、强大社区支持和广泛应用。1)易于学习和使用,适合初学者。2)拥有庞大的开发者社区,资源丰富。3)广泛应用于WordPress、Drupal等平台。4)与Web服务器紧密集成,简化开发部署。

超越炒作:评估当今PHP的角色超越炒作:评估当今PHP的角色Apr 12, 2025 am 12:17 AM

PHP在现代编程中仍然是一个强大且广泛使用的工具,尤其在web开发领域。1)PHP易用且与数据库集成无缝,是许多开发者的首选。2)它支持动态内容生成和面向对象编程,适合快速创建和维护网站。3)PHP的性能可以通过缓存和优化数据库查询来提升,其广泛的社区和丰富生态系统使其在当今技术栈中仍具重要地位。

PHP中的弱参考是什么?什么时候有用?PHP中的弱参考是什么?什么时候有用?Apr 12, 2025 am 12:13 AM

在PHP中,弱引用是通过WeakReference类实现的,不会阻止垃圾回收器回收对象。弱引用适用于缓存系统和事件监听器等场景,需注意其不能保证对象存活,且垃圾回收可能延迟。

解释PHP中的__ Invoke Magic方法。解释PHP中的__ Invoke Magic方法。Apr 12, 2025 am 12:07 AM

\_\_invoke方法允许对象像函数一样被调用。1.定义\_\_invoke方法使对象可被调用。2.使用$obj(...)语法时,PHP会执行\_\_invoke方法。3.适用于日志记录和计算器等场景,提高代码灵活性和可读性。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具