ThinkPHP 的模板引擎设计得非常灵活,它允许开发者使用多种风格的模板语法,从传统的类似 PHP 语法到更现代、更简洁的标签语法,这种灵活性是 ThinkPHP 模板系统的一大特点。

thinkphp 模板风格
(图片来源网络,侵删)

ThinkPHP 的模板风格可以概括为:以标签语法为核心,兼容原生 PHP,并支持多种引擎扩展

下面我们从几个方面来详细解析:


核心风格:标签语法

这是 ThinkPHP 模板最推荐、也是最主流的风格,它通过 {标签名 属性="值"} 的形式来执行逻辑和输出数据,使得模板文件和业务逻辑(PHP 代码)分离得非常清晰。

a) 变量输出

这是最基本的功能,ThinkPHP 会自动将控制器中分配的变量传递给模板。

thinkphp 模板风格
(图片来源网络,侵删)

控制器中分配变量:

namespace app\controller;
use think\facade\View;
class Index
{
    public function hello()
    {
        $name = 'ThinkPHP';
        $age = 10;
        View::assign('name', $name);
        View::assign('age', $age);
        // 或者使用批量赋值
        $data = [
            'user' => ['id' => 1, 'nickname' => 'Tom'],
            'articles' => [1 => '文章一', 2 => '文章二']
        ];
        View::assign($data);
        return View::fetch('hello');
    }
}

模板文件 hello.html 中输出:

<p>普通变量输出: {$name}</p>
<p>变量属性输出: {$user.nickname}</p>
<p>数组索引输出: {$articles[1]}</p>
<p>使用默认值: {$age|default=0}</p> <!-- $age 未定义,则输出 0 -->

b) 使用函数/修饰符

可以对变量进行简单的处理,如首字母大写、截取字符串等。

<p>原始名字: {$name}</p>
<p>首字母大写: {$name|ucfirst}</p>
<p>截取前5个字符: {$name|substr=0,5}</p>
<p>多个函数组合: {$name|md5|substr=0,8}</p>

c) 条件判断

使用 if 标签进行逻辑判断。

thinkphp 模板风格
(图片来源网络,侵删)
{if condition="$age eq 10"}
    <p>年龄正好是10岁。</p>
{elseif condition="$age gt 10"}
    <p>年龄大于10岁。</p>
{else /}
    <p>年龄小于10岁。</p>
{/if}

d) 循环输出

使用 volistforeach 标签遍历数组。

volist 标签(功能更强大,专为数组设计):

<!-- 遍历 user 数组 -->
<ul>
    {volist name="user" id="u"}
        <li>ID: {$u.id}, 昵称: {$u.nickname}</li>
    {/volist}
</ul>
<!-- 遍历 articles 数组,并指定 key -->
<ul>
    {volist name="articles" id="art" key="k"}
        <li>索引 [{$k}]: {$art}</li>
    {/volist}
</ul>

foreach 标签(语法更接近 PHP):

<ul>
    {foreach $user as $u}
        <li>昵称: {$u.nickname}</li>
    {/foreach}
</ul>

e) 模板包含与继承

这是 ThinkPHP 模板实现页面布局复用的核心机制。

  • 模板继承 (extend):定义一个基础布局模板,子模板可以继承它并覆盖指定区域。

    layout/base.html (基础模板):

    <!DOCTYPE html>
    <html>
    <head>
        <title>{block name="title"}默认标题{/block}</title>
    </head>
    <body>
        <header>网站头部</header>
        <div class="main">
            {block name="content"}这里是主内容区域{/block}
        </div>
        <footer>网站底部</footer>
    </body>
    </html>

    index/index.html (子模板):

    {extend name="layout/base" /}
    {block name="title"}首页 - 我的网站{/block}
    {block name="content"}
        <h1>欢迎来到首页!</h1>
        <p>这里是首页的具体内容。</p>
    {/block}
  • 模板包含 (include):在当前模板中插入另一个模板文件,用于复用公共模块,如头部、底部、侧边栏等。

    {include file="public/header" /}
    <h1>页面内容</h1>
    {include file="public/footer" /}

兼容风格:原生 PHP 语法

ThinkPHP 的模板引擎默认是兼容原生 PHP 语法的,这意味着你可以在模板文件中直接写 PHP 代码,这在某些复杂逻辑下非常有用,但不推荐,因为它破坏了模板与逻辑分离的原则。

<p>使用原生 PHP 输出变量:</p>
<?php echo $name; ?>
<p>使用原生 PHP 循环:</p>
<ul>
    <?php foreach($articles as $key => $value): ?>
        <li>Key: <?php echo $key; ?>, Value: <?php echo $value; ?></li>
    <?php endforeach; ?>
</ul>

其他模板引擎风格

ThinkPHP 的模板系统是可插拔的,除了默认的 Think 模板引擎,你还可以轻松切换到其他流行的模板引擎,如 Twig

a) Twig 风格

如果你熟悉 Symfony 或其他现代 PHP 框架,可能会更喜欢 Twig 的简洁和安全。

安装 Twig:

composer requiretwig/twig

配置模板引擎:config/tpl.phpconfig/view.php 中(版本不同配置文件可能略有差异):

return [
    'type'          => 'Twig', // 指定模板引擎类型
    // Twig 引擎的其他配置...
];

在模板中使用 Twig 语法:

{# 注释 #}
<p>变量输出: {{ name }}</p>
{# 条件判断 #}
{% if age > 10 %}
    <p>年龄大于10岁。</p>
{% else %}
    <p>年龄小于等于10岁。</p>
{% endif %}
{# 循环 #}
<ul>
    {% for user in users %}
        <li>{{ user.nickname }}</li>
    {% endfor %}
</ul>
{# 模板继承 #}
{% extends "layout/base.html" %}
{% block content %}
    <h1>首页内容</h1>
{% endblock %}

模板配置与优化

ThinkPHP 提供了丰富的配置选项来控制模板的行为,通常在 config/tpl.phpconfig/view.php 中配置。

// config/view.php
return [
    // 模板路径
    'view_path'          => app()->getAppPath() . 'view/',
    // 模板后缀
    'view_suffix'        => 'html',
    // 模板引擎
    'type'               => 'Think',
    // 模板开启布局
    'layout_on'          => true,
    // 布局模板文件
    'layout_name'        => 'layout',
    // 视图输出字符串内容替换
    'tpl_replace_string' => [
        '__STATIC__' => '/static',
        '__CSS__'    => '/static/css',
        '__JS__'     => '/static/js',
    ],
    // 关闭模板缓存
    'tpl_cache'          => false, 
    // 开启模板编译缓存
    'compile_cache'      => true,
];

常用配置项说明:

  • view_path: 指定模板文件的根目录。
  • view_suffix: 模板文件的后缀名,默认是 html
  • layout_on / layout_name: 控制模板布局的开启和布局文件名。
  • tpl_replace_string: 非常有用!用于在模板中替换常量,方便管理静态资源路径。
  • tpl_cache: 是否开启模板缓存,开发时建议关闭,线上环境开启以提高性能。

总结与建议

风格类型 语法示例 优点 缺点 适用场景
ThinkPHP 标签 {$name}, {volist}, {if} 推荐,逻辑清晰,与 PHP 分离,易读易维护。 需要学习一套新的标签语法。 绝大多数项目,特别是团队协作项目。
原生 PHP <?php echo $name; ?> 无需学习,对 PHP 开发者极其熟悉。 破坏 MVC 分层,安全性较低(需小心 XSS),模板可读性差。 快速原型开发、处理极其复杂的单个逻辑片段。
Twig {{ name }}, {% for %} 现代化、简洁、安全(自动转义)、功能强大。 需要额外安装和配置,学习成本。 喜欢 Twig 生态、追求更现代模板语法的项目。

最佳实践建议:

  1. 优先使用 ThinkPHP 标签语法:这是框架设计的初衷,能最好地发挥其优势,保持代码的规范性和可维护性。
  2. 善用模板继承和包含:这是构建清晰、可复用布局的关键。
  3. 合理使用 tpl_replace_string:统一管理静态资源路径,避免硬编码。
  4. 谨慎使用原生 PHP:仅在万不得已,且逻辑非常简单时使用,避免在模板中写复杂的业务逻辑。
  5. 为复杂项目考虑 Twig:如果你的团队对 Twig 更熟悉,或者项目对模板的纯净度和安全性有更高要求,切换到 Twig 是一个不错的选择。