display() 方法主要用于传统开发模式(非 MVC 或多应用模式下的单应用模式),在最新的多应用模式下,更推荐使用 return view() 的方式。

display() 方法的基本语法
display() 方法通常在控制器的方法中调用,其基本语法如下:
// 在控制器方法中
public function index()
{
// 1. 分配数据 (使用 assign)
$this->assign('name', 'ThinkPHP');
$this->assign('age', 10);
// 2. 渲染模板 (使用 display)
$this->display();
}
display() 方法本身可以接受一个或两个参数,我们来逐一分解。
参数详解
模板文件 (template)
第一个参数是可选的,用于指定要渲染的模板文件。
不传参数(最常用)

如果不传递任何参数,ThinkPHP 会按照默认的规则去寻找模板文件。
默认规则:应用目录/视图目录/控制器名/操作名.html
- 应用目录:如果你的应用是
index,那么路径就是application/index/。 - 视图目录:默认是
view,可以在config/view.php中配置。 - 控制器名:当前控制器的名称,
User控制器。 - 操作名:当前控制器方法的名称,
index方法。 - 模板后缀:默认是
html,也可以在config/view.php中配置。
示例:
假设你有一个控制器 application/index/controller/User.php,里面有一个方法 info()。
// application/index/controller/User.php
namespace app\index\controller;
class User
{
public function info()
{
// 不传参数,ThinkPHP 会自动寻找 application/index/view/user/info.html
$this->display();
}
}
传入相对路径

你可以传入一个相对于视图目录的相对路径来指定模板文件。
- 使用 作为目录分隔符。
- 可以省略模板的后缀名(推荐省略,因为后缀在配置中定义)。
示例:
继续上面的 info() 方法,如果我们想加载 application/index/view/public/header.html。
// 在 User 控制器的 info 方法中
public function info()
{
// 加载 public 目录下的 header.html 文件
// 实际路径: application/index/view/public/header.html
$this->display('public/header');
}
传入绝对路径(不推荐)
你也可以传入一个完整的模板路径,但这通常被认为是坏实践,因为它会降低代码的可移植性,因为硬编码了应用的视图路径。
示例:
// 不推荐这样做
$this->display('../application/index/view/user/detail.html');
模板布局 (layout)
第二个参数也是可选的,用于控制是否启用以及使用哪个模板布局。
什么是模板布局?
模板布局是一种“骨架”机制,你可以在一个布局文件(layout.html)中定义好网站的公共部分,<head>, <header>, <footer> 等,在具体的页面模板中,只需要编写核心内容,ThinkPHP 会自动将核心内容“注入”到布局文件的指定位置。
布局文件默认位置:应用目录/view/layout.html
布局文件中的内容占位符:使用 {__CONTENT__} 来标记内容将被插入的位置。
示例 layout.html:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">{:$title ?? '默认标题'}</title>
</head>
<body>
<header>网站头部</header>
<!-- 这里是主要内容区域 -->
{__CONTENT__}
<footer>网站底部</footer>
</body>
</html>
如何使用 display() 的第二个参数?
禁用布局
如果你想加载的页面不需要被布局包裹,可以将第二个参数设置为 false。
public function noLayout()
{
// 禁用布局,直接渲染 application/index/view/user/detail.html
$this->display('user/detail', false);
}
指定其他布局文件
如果你想使用一个非默认的布局文件,可以将第二个参数设置为布局文件的名称(不带后缀)。
假设你有一个 mobile_layout.html 文件。
public function mobilePage()
{
// 使用 mobile_layout.html 布局文件来渲染 user/mobile.html
$this->display('user/mobile', 'mobile_layout');
}
ThinkPHP 会去 application/index/view/ 目录下寻找 mobile_layout.html 文件。
完整示例
让我们把所有内容串起来看一个完整的例子。
目录结构
application/
└── index/
├── controller/
│ └── Index.php // 首页控制器
└── view/
├── layout.html // 默认布局文件
└── index/
└── hello.html // 首页模板文件
模板文件
application/index/view/layout.html:
<!DOCTYPE html>
<html>
<head>{:$title ?? 'ThinkPHP'}</title>
</head>
<body>
<div class="header">这是一个公共头部</div>
<hr>
{__CONTENT__}
<hr>
<div class="footer">这是一个公共底部</div>
</body>
</html>
application/index/view/index/hello.html:
<h1>Hello, {$name}!</h1>
<p>你的年龄是: {$age}</p>
<p>当前时间是: {:date('Y-m-d H:i:s')}</p>
控制器代码
application/index/controller/Index.php:
<?php
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
public function hello()
{
// 1. 向模板分配变量
$this->assign('name', '张三');
$this->assign('age', 25);
$this->assign('title', '欢迎页面');
// 2. 渲染模板
// display() 会自动应用 layout.html 布局
// 它会寻找 application/index/view/index/hello.html 作为内容
// 然后将内容填充到 layout.html 的 {__CONTENT__} 位置
$this->display();
}
public function about()
{
// 这个页面不需要布局
// 直接渲染 application/index/view/index/about.html
// 你需要先创建这个文件
$this->display('about', false);
}
}
当你访问 http://你的域名/index/index/hello 时,最终输出的 HTML 会是布局文件和 hello.html 内容的结合体。
重要提示:display() vs return view()
在 ThinkPHP 5.1 及更高版本的多应用模式下,官方推荐使用 return view()。
return view() 的优势:
- 更符合 PSR-2 规范:控制器方法明确返回一个响应对象,而不是直接输出。
- 链式调用更方便:可以方便地使用
assign()和view()的链式调用。 - 代码更简洁:通常一行代码就能完成数据分配和模板渲染。
return view() 的用法示例:
namespace app\index\controller;
class Index
{
public function hello()
{
// 推荐:链式调用,简洁明了
return view('index/hello', [
'name' => '李四',
'age' => 30
]);
// 或者分开写
// $this->assign('name', '李四');
// return view('index/hello');
}
}
| 特性 | display() |
return view() |
|---|---|---|
| 模式 | 传统模式 / 单应用模式 | 推荐 / 多应用模式 |
| 调用方式 | $this->display() |
return view() |
| 参数 | display(template, layout) |
view(template, data, layout) |
| 数据分配 | 必须用 $this->assign() |
可以在第二个参数数组中直接传递,也可以用 assign() |
| 返回值 | 直接输出到浏览器 | 返回一个 Response 对象,更规范 |
对于新项目,特别是使用 ThinkPHP 6+ 或多应用模式的项目,请优先使用 return view(),对于维护旧项目或使用 ThinkPHP 5.0 的单应用项目,display() 仍然是一个非常核心和重要的方法。
