ThinkPHP display参数如何正确使用?

99ANYc3cd6
预计阅读时长 20 分钟
位置: 首页 参数 正文

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

thinkphp display 参数
(图片来源网络,侵删)

display() 方法的基本语法

display() 方法通常在控制器的方法中调用,其基本语法如下:

// 在控制器方法中
public function index()
{
    // 1. 分配数据 (使用 assign)
    $this->assign('name', 'ThinkPHP');
    $this->assign('age', 10);
    // 2. 渲染模板 (使用 display)
    $this->display();
}

display() 方法本身可以接受一个或两个参数,我们来逐一分解。


参数详解

模板文件 (template)

第一个参数是可选的,用于指定要渲染的模板文件。

不传参数(最常用)

thinkphp display 参数
(图片来源网络,侵删)

如果不传递任何参数,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();
    }
}

传入相对路径

thinkphp 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() 的优势:

  1. 更符合 PSR-2 规范:控制器方法明确返回一个响应对象,而不是直接输出。
  2. 链式调用更方便:可以方便地使用 assign()view() 的链式调用。
  3. 代码更简洁:通常一行代码就能完成数据分配和模板渲染。

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() 仍然是一个非常核心和重要的方法。

-- 展开阅读全文 --
头像
Installshield安装参数如何正确配置?
« 上一篇 12-03
Dell Latitude 6500拆机步骤详解?
下一篇 » 12-03

相关文章

取消
微信二维码
支付宝二维码

最近发表

标签列表

目录[+]