ThinkPHP8学习篇(十三):视图

在MVC架构中,视图承担着数据展示与用户交互的核心职责,ThinkPHP 通过强大的模板引擎为视图层提供了简洁高效的解决方案。良好的视图设计能够实现业务逻辑与表现层的有效分离,提升代码可维护性与开发效率。本文作为视图主题的独立篇章,将系统学习模板变量的传递与显示、视图过滤的作用、模板渲染的方式。本篇文章将记录这些内容的学习过程。

视图

一、模板变量

二、视图过滤

三、模板渲染

1、模板路径

2、模板渲染

3、渲染内容

四、模板引擎

[1、使用 thinkTemplate 模板引擎](#1、使用 thinkTemplate 模板引擎)


视图

视图功能由 \think\View 类配合视图驱动(也即模板引擎驱动)类一起完成,新版仅内置了PHP原生模板引擎(主要用于内置的异常页面输出)。这里我们需要使用 think-template 模板引擎,需要安装 think-view 模板引擎驱动。安装命令如下所示(需要先进入应用目录后再执行安装命令):

bash 复制代码
composer require topthink/think-view

视图相关的配置在配置目录的 view.php 配置文件中进行定义。

可以直接使用 think\facade\View 来操作视图。

一、模板变量

在使用视图的时候,确保已经引入了门面类(后续的代码中不再做引入的说明,但是不要忘记引入):

php 复制代码
use think\facade\View;

模板中的变量(除了一些系统变量外)必须先进行模板赋值后才能使用,使用 assign 方法进行全局模板变量赋值。

php 复制代码
namespace app\controller;

use think\facade\View;

class Index
{
    public function index()
    {
        // 模板变量赋值
        View::assign('name','zhangsan');
        View::assign('email','test@126.com');
        // 或者批量赋值
        View::assign([
            'name'  => 'zhangsan',
            'email' => 'test@126.com'
        ]);
        // 模板输出
        return View::fetch('index');
    }
}

assign 方法赋值属于全局变量赋值,如果需要单次赋值的话,可以直接在 fetch 方法中传入。

php 复制代码
namespace app\controller;

use think\facade\View;

class Index
{
    public function index()
    {
        // 模板输出并变量赋值
        return View::fetch('index', [
            'name'  => 'zhangsan',
            'email' => 'test@126.com'
        ]);
    }
}

也可以使用 view 助手函数渲染输出,使用下面的方法进行模板变量赋值:

php 复制代码
return view('index', [
    'name'  => 'ThinkPHP',
    'email' => 'thinkphp@qq.com'
]);

助手函数的变量赋值也是当次模板渲染有效。

二、视图过滤

使用 filter 方法可以对视图的渲染输出进行过滤。例如:

php 复制代码
<?php
namespace app\index\controller;

use think\facade\View;

class Index 
{
    public function index()
    {
        // 使用视图输出过滤,将模板中的换行替换为 <br/> 标签
        return View::filter(function($content){
        	return str_replace("\r\n", '<br/>', $content);
        })->fetch('index');
    }
}

模板内容(index.html):

html 复制代码
Hello
World

显示如下图所示:

可以看到,内容成换行展示,已替换为 <br/> 标签。

如果使用 view 助手函数进行模板渲染输出的话,可以使用下面的方式:

php 复制代码
<?php
namespace app\index\controller;

class Index 
{
    public function index()
    {
        // 使用视图输出过滤
        return view('index')->filter(function($content){
        	return str_replace("\r\n", '<br/>', $content);
        });
    }
}

三、模板渲染

1、模板路径

默认情况下,框架会自动定位模板文件路径,优先定位应用目录下的 view 目录,这种方式的视图目录下就是应用的控制器目录。

因为本系列文章只记录单应用模式,所以下面只展示单应用模式的视图目录结构。

php 复制代码
├─app
│   └─view(视图目录)
│     ├─index            index控制器目录
│     │  └─index.html    index模板文件
│     └─ ...             更多控制器目录

如果需要自定义视图目录名称,可以通过设置 view_dir_name (配置文件为:config\view.php)配置参数。

php 复制代码
'view_dir_name' => 'template',

2、模板渲染

模板渲染的最典型用法是直接使用 fetch 方法,不带任何参数:

php 复制代码
<?php
namespace app\index\controller;

use think\facade\View;

class Index
{
    public function index()
    {
        // 不带任何参数 自动定位当前操作的模板文件
        return View::fetch();
    }
}

系统会按照默认规则自动定位视图目录下的模板文件,规则是:

php 复制代码
控制器名(小写+下划线)/操作名.html

默认的模板文件名规则改为实际操作方法名的小写+下划线写法。但可以配置 auto_rule 参数的值来改变当前操作的自动渲染规则。

|-----------------|-------------|
| auto_rule配置 | 自动定位规则 |
| 1 | 操作方法的小写+下划线 |
| 2 | 操作方法全部转换小写 |
| 3 | 保持和操作方法一致 |

如果更改模板引擎的 view_depr 设置(假设 'view_depr'=>'_')的话,则上面的自动定位规则变成:

php 复制代码
控制器(小写+下划线)_操作.html

如果没有按照模板定义规则来定义模板文件(或者需要调用其他控制器下面的某个模板),可以指定模板名称:

php 复制代码
// 指定模板输出
// 表示调用当前控制器下面的 edit 模板
return View::fetch('edit'); 

// 表示调用 member 控制器下面的 read 模板
return View::fetch('member/read');

渲染输出不需要写模板文件的路径和后缀。这里面的控制器和操作并不一定需要有实际对应的控制器和操作,只是一个目录名称和文件名称而已,例如,你的项目里面可能根本没有 Public 控制器,更没有 Public 控制器的 menu 操作,但是一样可以使用

php 复制代码
return View::fetch('public/menu');

输出这个模板文件。

支持从视图根目录开始读取模板,例如:

php 复制代码
return View::fetch('/menu');
// 表示读取的模板是:menu.html

如果模板文件位置比较特殊或者需要自定义模板文件的位置,可以采用下面的方式处理。

php 复制代码
return View::fetch('../template/public/menu.html');

这种方式需要带模板路径和后缀指定一个完整的模板文件位置,这里的 ../template/public 目录是相对于当前项目入口文件位置。

注意:模板文件位置是相对于应用的入口文件,而不是模板目录。

可以使用系统提供的助手函数 view,可以完成相同的功能:

php 复制代码
namespace app\index\controller;

class Index 
{
    public function index()
    {
        // 渲染模板输出
        return view('hello', ['name' => 'zhangsan']);
    }
}

3、渲染内容

如果希望直接解析内容而不通过模板文件的话,可以使用 display 方法:

php 复制代码
namespace app\index\controller;

use think\facade\View;

class Index 
{
    public function index()
    {
        // 直接渲染内容
        $content = '{$name}-{$email}';
        return View::display($content, ['name' => 'zhangsan', 'email' => 'test@126.com']);
    }
}

渲染的内容中一样可以使用模板引擎的相关标签。

四、模板引擎

1、使用 thinkTemplate 模板引擎

框架默认只能支持PHP原生模板,如果需要使用 thinkTemplate 模板引擎,需要安装 think-view 扩展(该扩展会自动安装 think-template 依赖库)。

bash 复制代码
composer require topthink/think-view

安装完成后,在配置目录的 config\view.php 文件中进行模板引擎相关参数的配置,例如:

php 复制代码
return [
    // 模板引擎类型使用Think
    'type'          => 'Think',
    // 默认模板渲染规则 1 解析为小写+下划线 2 全部转换小写 3 保持操作方法
    'auto_rule'     => 1,
    // 模板目录名
    'view_dir_name' => 'view',
    // 模板后缀
    'view_suffix'   => 'html',
    // 模板文件名分隔符
    'view_depr'     => DIRECTORY_SEPARATOR,
    // 模板引擎普通标签开始标记
    'tpl_begin'     => '{',
    // 模板引擎普通标签结束标记
    'tpl_end'       => '}',
    // 标签库标签开始标记
    'taglib_begin'  => '{',
    // 标签库标签结束标记
    'taglib_end'    => '}',
];

视图类也提供了 engine 方法对模板解析引擎进行初始化或者切换不同的模板引擎,例如:

php 复制代码
<?php
namespace app\index\controller;

use think\facade\View;

class Index
{
    public function index()
    {
        // 使用内置PHP模板引擎渲染模板输出
        return View::engine('php')->fetch('index');
    }
}

表示当前视图的模板文件使用原生PHP进行解析。

如果需要动态改变模板引擎的参数,请使用视图类提供的 config 方法进行动态设置,而不要使用改变配置类参数的方式。

php 复制代码
<?php
namespace app\index\controller;

use think\facade\View;

class Index 
{
    public function index()
    {
        // 改变当前操作的模板路径
        View::config(['view_path' => 'mypath']);
        return View::fetch();
    }
}
相关推荐
BingoGo2 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack2 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo3 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack3 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack4 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo4 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack5 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理6 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
QQ5110082856 天前
python+springboot+django/flask的校园资料分享系统
spring boot·python·django·flask·node.js·php
WeiXin_DZbishe6 天前
基于django在线音乐数据采集的设计与实现-计算机毕设 附源码 22647
javascript·spring boot·mysql·django·node.js·php·html5