目录
日期和date_modify
format
striptags
escape
首页 后端开发 php教程 树枝 - 最受欢迎的独立PHP模板引擎

树枝 - 最受欢迎的独立PHP模板引擎

Feb 09, 2025 am 09:07 AM

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

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1657
14
CakePHP 教程
1415
52
Laravel 教程
1309
25
PHP教程
1257
29
C# 教程
1229
24
在PHP API中说明JSON Web令牌(JWT)及其用例。 在PHP API中说明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

会话如何劫持工作,如何在PHP中减轻它? 会话如何劫持工作,如何在PHP中减轻它? Apr 06, 2025 am 12:02 AM

会话劫持可以通过以下步骤实现:1.获取会话ID,2.使用会话ID,3.保持会话活跃。在PHP中防范会话劫持的方法包括:1.使用session_regenerate_id()函数重新生成会话ID,2.通过数据库存储会话数据,3.确保所有会话数据通过HTTPS传输。

您如何在PHP中有效处理异常(尝试,捕捉,最后,投掷)? 您如何在PHP中有效处理异常(尝试,捕捉,最后,投掷)? Apr 05, 2025 am 12:03 AM

在PHP中,异常处理通过try,catch,finally,和throw关键字实现。1)try块包围可能抛出异常的代码;2)catch块处理异常;3)finally块确保代码始终执行;4)throw用于手动抛出异常。这些机制帮助提升代码的健壮性和可维护性。

说明PHP中的不同错误类型(注意,警告,致命错误,解析错误)。 说明PHP中的不同错误类型(注意,警告,致命错误,解析错误)。 Apr 08, 2025 am 12:03 AM

PHP中有四种主要错误类型:1.Notice:最轻微,不会中断程序,如访问未定义变量;2.Warning:比Notice严重,不会终止程序,如包含不存在文件;3.FatalError:最严重,会终止程序,如调用不存在函数;4.ParseError:语法错误,会阻止程序执行,如忘记添加结束标签。

包括,require,incement_once,require_once之间有什么区别? 包括,require,incement_once,require_once之间有什么区别? Apr 05, 2025 am 12:07 AM

在PHP中,include,require,include_once,require_once的区别在于:1)include产生警告并继续执行,2)require产生致命错误并停止执行,3)include_once和require_once防止重复包含。这些函数的选择取决于文件的重要性和是否需要防止重复包含,合理使用可以提高代码的可读性和可维护性。

PHP和Python:比较两种流行的编程语言 PHP和Python:比较两种流行的编程语言 Apr 14, 2025 am 12:13 AM

PHP和Python各有优势,选择依据项目需求。1.PHP适合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

什么是HTTP请求方法(获取,发布,放置,删除等),何时应该使用? 什么是HTTP请求方法(获取,发布,放置,删除等),何时应该使用? Apr 09, 2025 am 12:09 AM

HTTP请求方法包括GET、POST、PUT和DELETE,分别用于获取、提交、更新和删除资源。1.GET方法用于获取资源,适用于读取操作。2.POST方法用于提交数据,常用于创建新资源。3.PUT方法用于更新资源,适用于完整更新。4.DELETE方法用于删除资源,适用于删除操作。

See all articles