thinkphp-模版引擎驱动和赋值变量、模板引擎配置和渲染、模版的变量输出
引擎驱动
MVC 中,M(模型)和C(控制器)是前面我们所了解的内容,而V(视图)就是页面,TP6.0 默认不自带TT 模版引擎,它作为一个可选的扩展给开发人员安装;也就是说,并不一定非要使用模板引擎的语法规则来开发V(视图)部分;
文件混编
如果不用模版引擎,可以在控制器通过require()方法引入PHP 文件混编即可;
新建app/controller/Show.php文件
<?php
namespace app\controller;
class Show
{
public function index()
{
// 默认路径在public里面,如果要放其他路径需要加前缀
require 'test/1.php';
}
}
默认路径在public中,新建public/test/1.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>混编</title>
</head>
<body>
HTML+PHP
</body>
</html>
然后打开http://localhost/xuexi/tp6/public/show 即可看到效果。
如果要向1.php中传参:
public function index()
{
$name = 'wubin';
// 默认路径在public里面,如果要放其他路径需要加前缀
require 'test/1.php';
}
在public/test/1.php中
HTML+PHP . <?php echo $name; ?>
简单来说,就是将1.php与Show.php看作一个文件来用就行,在控制器中注册的变量,可以直接在require的模板文件中使用。
同样的,依赖注入的参数值也能拿到
namespace app\controller;
use app\Request;
class Show
{
public function index(Request $request)
{
$name = 'wubin';
// 默认路径在public里面,如果要放其他路径需要加前缀
require 'test/1.php';
}
}
HTML+PHP . <?php echo $name; echo '<br>' . $request->param('id'); ?>
访问:http://localhost/xuexi/tp6/public/show?id=5 即可获取到值。tp6的混编如此方便,甚至可以不用模板。
模板引擎
tp6的模板需要额外安装
composer require topthink/think-view
D:\phpstudy\phpstudy_pro\WWW\xuexi\tp6>composer require topthink/think-view
首先必须,在与app文件夹的同级目录下新建view文件夹,存放模板文件
比如我这里,新建view/show/index.html,然后在controller/Show.php中
<?php
namespace app\controller;
use think\facade\View;
class Show
{
public function index()
{
return View::fetch('index');
}
}
其中View::fetch(); 默认就是'index‘,如果指定fetch('www'),那么就会去找view/show/www.html这个模板。
注意,模板下的命名规则view/{控制器名称小写}/{模板名称}.html
在控制器区域,通过assign()设置一个向模版提供变量的赋值操作;
View::assign('name', 'wubin.work');
return View::fetch('index');
在view/show/index.html模板中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>模板</title>
</head>
<body>
模板 {$name}
</body>
</html>
也可以使用数组的方式传值
View::assign([
'name' => 'wubin',
'email' => 'ww@163.com'
]);
return View::fetch('index');
模板 {$name} {$email}
也可以直接通过fetch()方法的第二参数,直接用数组传递模版变量;
return View::fetch('index', [
'name' => 'wubin',
'email' => 'ww@163.com'
]);
助手函数view(),和View::fetch()一样;
return view('index', [
'name' => 'wubin',
'email' => 'ww@163.com'
]);
可以使用filter()方法,对所有模版的变量进行过滤操作;
// View::assign('name', 'wubin.work');
View::assign([
'name' => 'wubin',
'email' => 'ww@163.com'
]);
// $content就相当于for循环遍历了assign数组中的每个键值 返回的值就是$content
return View::filter(function($content) {
// 对assign数组中的值进行处理 比如替换掉换行符等
return strtoupper($content);
})->fetch('index');
$content就相当于所有的参数都在里面执行了一遍过滤。
使用助手函数的写法
return view('index')->filter(function($content) {
// 对assign数组中的值进行处理 比如替换掉换行符等
return strtoupper($content);
});
模板配置和渲染
配置
默认情况下,config/view.php 就是默认模版引擎的配置文件;
return [
// 模板引擎类型使用Think
'type' => 'Think',
// 默认模板渲染规则 1 解析为小写+下划线 2 全部转换小写 3 保持操作方法
'auto_rule' => 1,
// 模板目录名 存放模板的目录 这里指app/view目录
'view_dir_name' => 'view',
// 模板后缀 配用之后fetch(‘index') 就不用加index.html了
'view_suffix' => 'html',
// 模板文件名分隔符
'view_depr' => DIRECTORY_SEPARATOR,
// 模板引擎普通标签开始标记
'tpl_begin' => '{',
// 模板引擎普通标签结束标记
'tpl_end' => '}',
// 标签库标签开始标记
'taglib_begin' => '{',
// 标签库标签结束标记
'taglib_end' => '}',
];
内部的配置注释写的非常清楚了,一般情况下,不需要任何改动;
渲染
除了在配置文件修改外,还可以在控制器端动态修改模版配置;
View::config(['view_dir_name' => 'view2']);
return View::fetch();
如此改后,如果不存在文件,则会报错
模板文件不存在:D:\phpstudy\phpstudy_pro\WWW\xuexi\tp6\view2\show\index.html
默认情况下,调用的是本控制器的模版文件,也可以调用其它控制器的模版文件;
比如比如controller/Show.php 中使用
return View::fetch('index');
调用的是view/show/index.html 模板
如果要调用其他(文件夹)控制类下的模板
return View::fetch('Address/index');
调用的是view/address/index.html 模板
如果你是多模块(多应用)模式下,也可以实现跨模块调用模版文件;
return View::fetch('admin@User/index');
模板文件不存在:D:\phpstudy\phpstudy_pro\WWW\xuexi\tp6\view\admin\User\index.html
如果直接在view 根目录下的模版文件,用一个斜杠来设定即可调用;
return View::fetch('/index');
模板文件不存在:D:\phpstudy\phpstudy_pro\WWW\xuexi\tp6\app\view\index.html
如果想调用public 公共目录的模版文件,用../public 后面跟着URL 即可;
return View::fetch('../../public/test/test');
找到public/test/test.html文件
在安装了模板引擎的条件下,依然要使用原生PHP进行书写
return View::engine('php')->fetch('index');
如果设置了之后,就不会再支持模板语法,模板中的语法会直接当作内容输出
浏览器页面直接输出:模板 {$name} {$email}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
模板 {$name} {$email} // 由于不支持模板引擎了 这里会直接在浏览器页面上打印
<?php
echo 123; // 支持,会直接输出
echo $name; // 不支持,不允许在任意位置定义,必须通过fetch第二个参数传递后才行
?>
</body>
</html>
在废除模板引擎,使用原生PHP的时候,必须通过fetch第二个参数传递变量
return View::engine('php')->fetch('index', [
'name' => 'wubin',
'email' => 'ww@163.com'
]);
<body>
模板 {$name} {$email} // 由于不支持模板引擎了 这里会直接在浏览器页面上打印
<?php
echo 123; // 支持,会直接输出
echo $name; // fetch传递后,才能正确获取
echo $email; // 同上
?>
</body>
注意,如果这里废弃模板引擎,使用原生PHP做模板,建议使用PHP文件后缀,不要用html后缀,view/show/index.php,然后在配置文件中将文件后缀改为php
模版的变量输出
当程序运行的时候,会在runtime/temp 目录下生成一个编译文件;
默认情况下,输出的模版变量会自动进行过滤,过滤函数默认如下:
<?php echo htmlentities($name); ?>
变量输出
如果传递的值是数组,在模版区域可以使用$data.name 这种形式输出;
$arr = [
'name' => 'wubin',
'age' => 110
];
return View::fetch('output', [
'arr' => $arr
]);
在app/view/show/output.html中
<body>
{$arr.name} -- {$arr.age}
</body>
如果传递的值是对象,那么编译文件也会自动相应的对应输出方式;
比如,这里我直接将类的$this传递到模板中
<?php
namespace app\controller;
use think\facade\View;
class Show
{
public $name = 'work';
public $age = 100;
const PI = 3.14;
public function output()
{
$arr = [
'name' => 'wubin',
'age' => 110
];
return View::fetch('output', [
'arr' => $arr,
// 相当于将对象的this传到模板中
'obj' => $this
]);
}
public function fn()
{
return '方法';
}
public static function fn2()
{
return '方法2';
}
}
模板中
<body>
{$arr.name} -- {$arr.age}
<br>
{$obj->name} -- {$obj->age} -- {$obj->fn()} -- {$obj::PI} -- {$obj::fn2()}
</body>
注意,不管静态方法还是普通方法,都使用->调用就行,将::留给常量,便于区分
其他输出
如果输出的变量没有值,可以直接设置默认值代替;
{$data.name|default='没有姓名'}
系统变量有:$_SERVER、$_ENV、$_GET、$_POST、$_REQUEST、$_SESSION 和$_COOKIE;统统用Request对象,在模板中输出
比如访问:http://localhost/xuexi/tp6/public/show/output?id=5
<body>
{$Request.get.id} -- {$Request.param.id} -- {$Request.host}
</body>
最终输出:5 -- 5 -- localhost
{$Request.get.id} -- {$Request.param.id} 作用相同
常量、配置信息等都可以通过$Think 输出(基本很少使用)
{$Think.const.PHP_VERSION} // 得到PHP版本
{$Think.PHP_VERSION}
{$Think.config.app.app_host}
{$Think.config.session.name}