控制器类 Controller.php
1.五个属性
* 视图类实例对象:protected $view;
* 请求类实例对象:protected $request;
* 验证失败是否抛出异常:protected $failException = false;
* 是否批量验证:protected $batchValidate = false;
* 前置方法列表:protected $beforeActionList = [];
2.八个方法
* 构造方法:public function __construct($Request $request = null)
* 初始化方法:protected function _initialize(){} //默认为空
* 加载模板:proctected function fetch($template="",$vars=[],$replace=[],$config=[])
* 渲染内容:protected function display($content="",$vars=[],$replace=[],$config=[])
* 模板变量赋值:protected function assign($name,$value="")
* 初始化模板引擎:protected function engine($engine)
* 验证失败抛出异常:protected function validateFailException($fail=true)
* 验证数据:protected function validate($data,$validate,$message=[],$batch=false,$callback=null)
3.可访问控制器
* 'url_controller_layer' => 'controller', // 默认的访问控制器层
4.可访问操作
* 访问限制符 public
5.命名空间,它与控制器或方法后缀的关系
* 'controller_suffix' => false, // 控制器类后缀
* 'action_suffix' => '', // 操作方法后缀
* 'url_convert' => true,// 是否自动转换URL中的控制器和操作名
* UserLogin类访问时 user_login
6.自定义访问控制器层
* 'url_controller_layer' => 'controller', // 默认的访问控制器层
7.创建多级控制器
* 目录 application\index\controller\user
* 命名空间 namespace app\index\controller\user;下创建 Demo.php
* 访问:tp5.com/index/user.demo/index
8.创建空操作和空控制器
* 在控制器中创建空操作
public function _empty($method){
return '你访问的方法'.$method.'不存在';
}
* 创建空的控制器
'empty_controller' => 'Error', // 默认的空控制器名
在application\index\controller 下创建error控制器
<?php
namespace app\index\controller;
class Error
{
public function test()
{
return '空控制器的方法';
}
//空控制器中的空操作
public function _empty($method){
return '你访问的方法'.$method.'不存在';
}
}
9.在控制器中使用trait有什么好处
* 在没有继承父类controller 又想使用它里面的方法时 使用 use\traits\controller\Jump;引入。
10.什么是单一模块?什么时候需要使用它?
* 配置:'app_multi_module' => false, // 关闭多模块设计
* 目录 application\controller
* 命名空间 namespace app\controller; 创建Index.php
* 访问:tp5.com\index\demo
* 单模块下 在controller目录下创建admin和home目录完成多级控制器
公共操作与公共类
1.公共操作用及创建公共操作
* 构造方法通常是公共的
<?php
namespace app\index\controller;
class Index extends \think\Controller //继承controller类
{
protected $lession;
/*public function __construct($lession='thinkphp5')
{
$this->lesssion = $lession;
}
public function demo1()
{
return (new self('php'))->lession;
}*/
public function _initialize($lession='thinkphp5')
{
$this->lesssion = $lession;
}
public function demo1()
{
$this->_initialize('php'); //调用方法
return $this->lession;
}
public function demo2()
{
return $this->lession;
}
}
2.公共控制器类 Base.php
* class Index extends Base{}
3.控制器中的公共操作,解决了类中数据共享以及属性初始化的问题。
4.公共控制器,从控制器层面上,解决了控制器类之间的属性和方法的共享问题。
控制器前置操作
1.什么是前置操作
2.为什么必须继承基类Controller,才能创建前置操作
* 第一步:创建前置操作方法
* 第二步:配置前置操作列表
<?php
namespace app\index\controller;
protected $beforeActionList = [ //前置方法列表,继承自Controller
'before1'=>'', //为空,表示before1是当前类中的全部操作的前置操作
//'before2'=>['only'=>'demo2'], //仅对demo2有效
'before2'=>['except'=>'demo2'], //排除法,对demo2之外的操作有效
];
protected $siteName; //自定义属性
protected function before1()
{
//$this->siteName = 'php';
$this->siteName = $this->request->param('name');
}
protected function before2()
{
$this->siteName = "php1";
}
public function demo1()
{
return $this->siteName;
}
public function demo2()
{
return $this->siteName;
}
public function demo3()
{
return $this->siteName;
}
3.前置操作有什么用,如何使用?构造方法可以看做是类的前置操作
页面跳转与重定向
1.页面跳转(必须继承基类Controller)
* 调用方法: $this->success('提示','地址'); 和 $this->eroor('提示','地址');
* 1.当前控制器 2.跨控制器 3.跨模块 4.外部地址(必须用协议开头)
eg:$this->success('成功','demo/login/ok');
eg:$this->success('成功',\think\Url::build('demo/login/ok'));
eg:$this->success('成功',url('demo/login/ok')); //助手函数url
2.重定向
* 调用方法:$this->redirect('路由地址',[变量列表],'后缀','域名开关');//路由地址,请求变量,后缀,是否显示域名
* 1.站内地址 2.外部地址
eg: $this->redirect('ok',['sitename'=>'php']);
eg: $this->redirect('http://www.baidu.com','302'); //302是临时重定向 301是永久重定向
请求对象与参数绑定
1.请求变量与请求对象的关系
public function demo($id = '',$name='')
{
$request = \think\Request::instance();
dump($request->get()); //
}
2.$request->param();可有获取post、get的参数 $request->has('name'); //判断是否存在某个变量,返回布尔值
3.postman 模式数据 在Params -> body -> x-www-form-urlencoded 下输入参数
4.请求信息包括:
* $request->domain(); //域名
* $request->url(); //获取url,不包括域名
* $request->url(true); //获取url,包含域名
* $request->pathinfo(); //获取url,一直到最后
* $request->path(); //获取url,一直到最后但不包含后缀
* $request->ext(); //获取后缀
* $request->module(); //获取模块
* $request->controller(); //获取控制器
* $request->action(); //获取方法
* $request->action('test'); //可以重新设置
* $request->method(); //请求类型
* $request->ip(); //
* $request->only('id'); //只获取变量id的值
* $request->except('id'); //只获取除变量id的以外值
5.顺序绑定参数
* convention.php中 'url_param_type'=>0, //0表示按成对解析,1表示按顺序解析
7.$request->param();只能获取url中的数据,不能获取方法中变量的默认值
请求对象的属性注入和方法注入
1.属性注入:\think\Request::instance()->属性
2.方法注入:\think\Request::hook('方法','对应函数')
3.作用:给当前请求对象绑定属性和方法,请求对象在应用的整个生命周期内都是有效的,不仅可以
被当前所有控制器方法所共享,还可以跨控制器和模块进行调用。
eg:同一个控制器中跨操作共享 Index.php
public function demo1($name)
{
return $this->request->param('name');
}
public function demo1($name)
{
return $this->request->param('name');
}
跨控制器和跨模块共享
* 给请求对象注入的自定义属性和方法,与原请求对象中的属性和方法是同级的,所以在整个
应用的生命周期内都是有效的。
* 请求对象的属性方法注入写入到common.php中
<?php
use think\Request;
$request = Request::instance();
//请求对象的属性注入
$request->siteName = "php";
//请求对象的方法注入 绑定的第一个参数必须Request类型的变量
function getSiteName(Request $request)
{
return $request->siteName
}
//注册请求对象的方法,也叫钩子
Request::hook('getName','getSiteName');
* 在Index.php中访问
public function demo1($name)
{
return $this->request->siteName;
}
public function demo1($name)
{
return $this->request->getName();
}
* 请求对象的属性与方法注入,不仅可以扩展请求对象的功能,实现在整个应用周期的信息共享,
而且它还可以为自定义请求的行为指定标准。
对象变量的依赖注入
1.依赖注入:改变了使用对象前,必须先创建对象的传统方式,而是从外部注入所依赖的对象。
2.thinkphp5依赖注入主要是指把对象注入到可访问控制器
3.注入方式:控制器的构造方法和操作方法
4.实现方式:对参数进行对象类型约束则会自动触发依赖注入,自动实例化该对象
5.访问控制器的参数都来自于URL请求
* 普通变量 -> 参数绑定(按名称或顺序绑定) -> 操作方法(构造方法或普通操作)
* 对象变量 -> 依赖注入(通过类型约束自动实例化绑定) -> 操作方法(构造方法或普通操作)
<?php
namespace app\index\controller;
use think\Request;
class Index
{
protected $request;
public function __construct(Request $request)
{
$this->request = Request::instance();
}
/*public function demo1(Request $request) //依赖注入
{
return $request->param('lession');
}*/
public function demo2()
{
return $this->request->param('lession');
}
}