ThinkPHP5视图入门

Published on 2016 - 12 - 20

视图实例化

视图功能由\think\View类配合视图驱动(模板引擎)类一起完成,目前的内置模板引擎包含PHP原生模板和Think模板引擎。

因为新版的控制器可以无需继承任何的基础类,因此在控制器中如何使用视图取决于你怎么定义控制器。

继承\think\Controller类

如果你的控制器继承了\think\Controller类的话,则无需自己实例化视图类,可以直接调用控制器基础类封装的相关视图类的方法。

 // 渲染模板输出
return $this->fetch('hello',['name'=>'thinkphp']);

下面的方法可以直接被调用:

方法 说明
fetch 渲染模板输出
display 渲染内容输出
assign 模板变量赋值
engine 初始化模板引擎

如果需要调用View类的其它方法,可以直接使用$this->view 对象:

助手函数

如果你只是需要渲染模板输出的话,可以使用系统提供的助手函数view,可以完成相同的功能:

return view('hello',['name'=>'thinkphp']);

助手函数调用格式:

view('[模板文件]'[,'模板变量(数组)'][,模板替换(数组)])

无论你是否继承think\Controller类,助手函数都可以使用,也是最方便的一种。

直接实例化视图类(不建议)

任何情况下,你都可以直接实例化视图类进行渲染模板。

// 实例化视图类
$view = new View();
 // 渲染模板输出 并赋值模板变量
return $view->fetch('hello',['name'=>'thinkphp']);

实例化视图类的时候,可以传入模板引擎相关配置参数,例如:

// 实例化视图类
$view = new View([
    'type'          => 'think',
    'view_path'     => '',
    'view_suffix'   => 'html',
    'view_depr'     => '/',
]);
 // 渲染模板输出 并赋值模板变量
return $view->fetch('hello',['name'=>'thinkphp']);

如果需要使用应用自己扩展的模板引擎驱动,可以使用:

// 实例化视图类
$view = new View([
    'type'          => '\org\template\Think',
    'view_path'     => '',
    'view_suffix'   => 'html',
    'view_depr'     => '/',
]);

如果实例化不当,很容易导致配置参数无效的情况。因此如果不是必要,不建议直接实例化View类进行操作。

模板引擎初始化

视图的模板文件可以支持不同的解析规则,默认情况下无需手动初始化模板引擎。

可以通过下面的几种方式对模板引擎进行初始化。

配置文件

在应用配置文件中配置template参数即可,例如:

'template'               => [
    // 模板引擎类型 支持 php think 支持扩展
    'type'         => 'Think',
    // 模板路径
    'view_path'    => './template/',
    // 模板后缀
    'view_suffix'  => 'html',
    // 模板文件名分隔符
    'view_depr'    => DS,
    // 模板引擎普通标签开始标记
    'tpl_begin'    => '{',
    // 模板引擎普通标签结束标记
    'tpl_end'      => '}',
    // 标签库标签开始标记
    'taglib_begin' => '{',
    // 标签库标签结束标记
    'taglib_end'   => '}',
],

调用视图类进行操作或者使用view助手函数的时候会自动实例化相关的模板引擎并传入参数。

视图根目录

视图文件的根目录默认情况下位于模块的view目录,每个模块的视图目录可以通过模板参数view_path自定义。

V5.0.3+版本开始,新增了view_base模板引擎参数,可以用于定义全局的视图根目录,然后模块作为子目录。

实例化视图

可以在实例化视图的时候直接传入模板引擎配置参数,会在渲染输出的时候自动初始化模板引擎,例如:

$view = new View([
    'type'               => 'think',
    'view_path'          => './template/',
    'view_suffix'        => 'php',
    'view_depr'          => DS,
    'tpl_begin'          => '{', // 模板引擎普通标签开始标记
    'tpl_end'            => '}', // 模板引擎普通标签结束标记
    'strip_space'        => true, // 去除模板文件里面的html空格与换行
    'tpl_cache'          => true, // 开启模板编译缓存
    'taglib_pre_load'    => '', // 需要额外加载的标签库(须指定标签库名称),多个以逗号分隔
    'tpl_replace_string' => [],// 模板过滤输出(与输出替换章节不同,前者对模版进行过滤)
]);

think模板引擎是ThinkPHP内置的一个基于XML的高效的编译型模板引擎,系统默认使用的模板引擎是内置模板引擎。

调用engine方法初始化

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

$view = new View();
return $view->engine('php')->fetch();

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

设置模板引擎参数

除了在实例化的时候传入外,可以动态设置模板引擎的相关参数,例如:

$view = new View();
return $view->config('view_path','./template/')->fetch();

模板赋值

除了系统变量和配置参数输出无需赋值外,其他变量如果需要在模板中输出必须首先进行模板赋值操作,绑定数据到模板输出有三种方式:

assign方法

namespace index\app\controller;

class Index extends \think\Controller
{
    public function index()
    {
        // 模板变量赋值
        $this->assign('name','ThinkPHP');
        $this->assign('email','thinkphp@qq.com');
        // 或者批量赋值
        $this->assign([
            'name'  => 'ThinkPHP',
            'email' => 'thinkphp@qq.com'
        ]);
        // 模板输出
        return $this->fetch('index');
    }
}

传入参数方法

方法fetch 及 display 均可传入模版变量,例如

namespace app\index\controller;

class Index extends \think\Controller
{
    public function index()
    {
        return $this->fetch('index', [
            'name'  => 'ThinkPHP',
            'email' => 'thinkphp@qq.com'
        ]);
    }
}
class Index extends \think\Controller
{
    public function index()
    {
        $content = '{$name}-{$email}';
        return $this->display($content, [
            'name'  => 'ThinkPHP',
            'email' => 'thinkphp@qq.com'
        ]);
    }
}

对象赋值

class Index extends \think\Controller
{
    public function index()
    {
        $view = $this->view;
        $view->name     = 'ThinkPHP';
        $view->email    = 'thinkphp@qq.com';
        // 模板输出
        return $view->fetch('index');
    }
}

助手函数

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

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

模板渲染

模板渲染

渲染模板最常用的是使用\think\View类的fetch方法,调用格式:

fetch('[模板文件]'[,'模板变量(数组)'])

模板文件的写法支持下面几种:

用法 描述
不带任何参数 自动定位当前操作的模板文件
[模块@][控制器/][操作] 常用写法,支持跨模块
完整的模板文件名 直接使用完整的模板文件名(包括模板后缀)

下面是一个最典型的用法,不带任何参数:

// 不带任何参数 自动定位当前操作的模板文件
$view = new View();
return $view->fetch();

表示系统会按照默认规则自动定位模板文件,其规则是:

当前模块/默认视图目录/当前控制器(小写)/当前操作(小写).html

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

当前模块/默认视图目录/当前控制器(小写)_当前操作(小写).html

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

// 指定模板输出
return $view->fetch('edit'); 

表示调用当前控制器下面的edit模板

return $view->fetch('member/read');

表示调用Member控制器下面的read模板。

跨模块渲染模板

return $view->fetch('admin@member/edit');

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

return $view->fetch('public/menu');

输出这个模板文件。理解了这个,模板输出就清晰了。

fetch方法支持在渲染输出的时候传入模板变量,例如:

return $view->fetch('read', ['a'=>'a','b'=>'b']);

自定义模板路径

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

渲染完整模板

return $view->fetch('./template/public/menu.html');

这种方式需要带模板路径和后缀指定一个完整的模板文件位置,这里的template/public目录是位于当前项目入口文件位置下面。如果是其他的后缀文件,也支持直接输出,例如:

return $view->fetch('./template/public/menu.tpl');

只要./template/public/menu.tpl是一个实际存在的模板文件。

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

渲染内容

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

$view = new View();
return $view->display($content,$vars);

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

输出替换

模板输出替换

支持对视图输出的内容进行字符替换,例如:

namespace index\app\controller;

class Index extends \think\Controller
{
    public function index()
    {
        $this->assign('name','thinkphp');
        return $this->fetch('index',[],['__PUBLIC__'=>'/public/']);
    }
}

如果需要全局替换的话,可以直接在配置文件中添加:

'view_replace_str'  =>  [
    '__PUBLIC__'=>'/public/',
    '__ROOT__' => '/',
]

然后就可以直接使用

namespace index\app\controller;

class Index extends \think\Controller
{
    public function index()
    {
        $this->assign('name','thinkphp');
        return $this->fetch('index');
    }
}

如果你手动实例化视图类,请确保在实例化的时候传入配置参数:

$view = new View([],Config::get('view_replace_str'));
return $view->fetch();

助手函数view也支持全局配置参数view_replace_str的设置,如果需要设置不同的替换参数,可以使用:

return view('index',['name'=>'thinkphp'],['__PUBLIC__'=>'/public/']);

在渲染模板或者内容输出的时候就会自动根据设置的替换规则自动替换。

要使得你的全局替换生效,确保你的控制器类继承think\Controller或者使用view助手函数渲染输出。

参考文档