ThinkPHP 拥有一套非常强大且灵活的模板引擎,它遵循 MVC(Model-View-Controller)架构,其中模板层就是 View 的核心部分,它的设计初衷是让开发者能够更高效、更直观地编写 HTML 页面,同时将业务逻辑(PHP 代码)与页面表现(HTML/JS/CSS)清晰地分离开。

下面我将从几个方面为你详细解析 ThinkPHP 的网站模板:
模板基础:基本语法和用法
ThinkPHP 的模板引擎语法非常人性化,以 和 包裹,易于上手。
变量输出
这是最常用的功能,在控制器中分配变量,然后在模板中直接输出。
控制器代码示例:

namespace app\controller;
use think\facade\View;
class Index
{
public function hello()
{
// 向模板中分配变量
View::assign('name', 'ThinkPHP');
View::assign('age', 10);
View::assign('user', ['id' => 1, 'username' => 'admin']);
// 渲染模板
return View::fetch('hello');
}
}
模板文件 hello.html 示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">ThinkPHP 模板示例</title>
</head>
<body>
<h1>Hello, {$name}!</h1>
<p>你的年龄是:{$age}岁。</p>
<p>用户名是:{$user.username}</p>
<p>用户ID是:{$user['id']}</p>
</body>
</html>
{$name}:输出简单变量。{$user.username}或{$user['id']}:输出数组/对象的属性或元素,ThinkPHP 的模板引擎非常智能,可以自动识别。
使用函数
模板引擎支持对变量使用 PHP 内置函数或自定义函数,用于处理数据。
<p>原始字符串:{$str}</p>
<p>大写转换:{:strtoupper($str)}</p>
<p>截取前10个字符:{:mb_substr($str, 0, 10)}</p>
<p>默认值:{$empty_var|default('没有数据')}</p>
{:function($var)}:调用函数并输出结果。{$var|function}:使用“修饰符”风格,更推荐,因为可以链式调用。
模板注释
模板注释不会在最终渲染的 HTML 中显示,仅供开发者查看。
{这是模板注释,不会被渲染到页面上}
{* 这是另一种风格的注释 *}
条件判断
使用 if、elseif、else 进行逻辑判断。

{if $age >= 18}
<p>你已经成年了。</p>
{elseif $age > 0}
<p>你还未成年。</p>
{else}
<p>年龄未知。</p>
{/if}
循环输出
使用 volist 或 foreach 循环数组。
volist 标签(专为循环数组设计,功能更强大)
<volist name="userList" id="user">
<p>ID: {$user.id}, 姓名: {$user.name}</p>
</volist>
<!-- 如果需要显示循环次数 -->
<volist name="userList" id="user" key="i">
<p>第 {$i} 条:ID: {$user.id}, 姓名: {$user.name}</p>
</volist>
foreach 标签(更通用)
<foreach name="userList" item="user">
<p>ID: {$user.id}, 姓名: {$user.name}</p>
</foreach>
模板布局
模板布局是 ThinkPHP 的一个非常实用的功能,可以实现网站的“公共部分”(如头部、底部、侧边栏)与“内容部分”的分离,避免代码重复。
开启全局布局
在 config/view.php 配置文件中设置。
// config/view.php
return [
// ... 其他配置
'layout_on' => true, // 开启布局
'layout_name' => 'layout', // 布局模板文件名(默认是 layout)
];
创建布局模板
在 view 目录下创建 layout.html 文件。
view/layout.html 示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">{block name="title"}默认标题{/block}</title>
</head>
<body>
<header>
<h1>这是网站公共头部</h1>
<nav>导航栏...</nav>
</header>
<main>
<!-- 使用 {content} 标记来放置子模板的内容 -->
{__CONTENT__}
</main>
<footer>
<p>这是网站公共底部 © 2025</p>
</footer>
</body>
</html>
{__CONTENT__}是一个特殊的占位符,ThinkPHP 会自动将被渲染的子模板内容填充到这里。
创建子模板
在 view 目录下创建你的页面模板,index.html。
view/index.html 示例:
{extend name="layout" /} <!-- 继承 layout.html 布局 -->
{block name="title"}首页 - 我的网站{/block} <!-- 覆盖布局中的 title 块 -->
{block name="main_content"}
<h2>欢迎来到首页!</h2>
<p>这里是首页的特有内容。</p>
{/block}
{extend name="layout" /}:声明继承自layout.html。{block name="..."}:定义一个块,用于覆盖布局文件中同名的块,如果没有定义,布局中的默认内容会保留。
模板继承
模板继承是布局的升级版,提供了更灵活的控制,你可以定义多个可替换的区域,而不仅仅是 {__CONTENT__}。
父模板(base.html):
<!DOCTYPE html>
<html>
<head>{block name="title"}默认标题{/block}</title>
{block name="head"}<link rel="stylesheet" href="style.css">{/block}
</head>
<body>
{block name="header"}公共头部{/block}
{block name="content"}主要内容{/block}
{block name="footer"}公共底部{/block}
</body>
</html>
子模板(page.html):
{extend name="base" /}
{block name="title"}关于我们{/block}
{block name="head"}
{parent} <!-- 保留父块中的内容 -->
<link rel="stylesheet" href="about.css">
{/block}
{block name="content"}
<h1>关于我们页面</h1>
<p>公司介绍...</p>
{/block}
{parent}:在子块中调用,表示将父模板中同名块的内容合并进来。
常用标签和功能
-
包含文件
{include}:用于引入其他模板片段,实现公共组件化。{include file="public/header" /} -
URL 生成
{:url}:在模板中生成完整的 URL 地址,是开发中极其重要的功能。<a href="{:url('user/profile', ['id' => 1])}">查看我的个人资料</a> <!-- 生成的URL可能是 /index.php/user/profile?id=1 --> -
配置输出
{:config}:直接在模板中输出配置项的值。<p>网站名称:{:config('app.app_name')}</p> -
常量输出
{:constant}:输出 PHP 预定义常量。<p>当前PHP版本:{:constant('PHP_VERSION')}</p>
模板引擎的开启与关闭
ThinkPHP 默认开启模板引擎,如果你只想输出纯变量而不需要解析 语法,可以关闭它。
在控制器中临时关闭:
return View::fetch('hello', [], ['engine' => false]);
在配置文件中全局关闭:
// config/view.php
return [
// ... 其他配置
'view_on' => false, // 关闭模板引擎
];
模板文件存放位置
ThinkPHP 的模板文件默认存放在 app/view 目录下,目录结构通常与控制器对应:
app/view/index/对应 `app/controller/Index
