学习教程来源于:
php中文网 ThinkPHP5 视频教程
ThinkPHP5.0完全开发手册
控制器类的5个属性和8个方法
五个属性:
1.视图类实例对象:protected $view
2.请求实例对象:protected $request
3.验证失败是否抛出异常:protected $faliException=false
4.是否批量验证:protected $batchValidate=false
5.前置方法列表:protected $beforeActionList=[];
八个方法:
1.构造方法:public fucntion __construct(Request $request=null)
2.初始化方法:protected function _initialize{} //默认为空
3.加载模板:protected function fetch($template = '',$vars = [],$replace = [],$config = [])
4.渲染内容:protected function display($content='',$vars=[].$replace=[],$config=[])
5.模板变量赋值:protected function assign($name,$value='')
6.初始化模板引擎:protected function engine($engine)
7.验证失败抛出异常:protected function validateFailException($fail = true)
8.验证数据:protected function validate($data, $validate, $message = [], $batch = false, $callback = null)
外部可访问的操作 只有public操作 privated和protected都不可访问
命名空间:namespace 根空间+子空间(可选)+类名
(确保类名与第三方的类不冲突)
TP5中预置了三个根命名空间:think/traits/app
控制器类|操作方法后缀:(为了防止类名与系统关键字冲突)
// 控制器类后缀
'controller_suffix' => false,
// 默认的访问控制器层
'url_controller_layer' => 'controller',
// 操作方法后缀
'action_suffix' => '',
1.自定义访问控制器层
// 默认的访问控制器层
'url_controller_layer' => 'controller',
2.创建多级控制器
tp5.com/index/user.demo/index
user为多级控制器目录名称
3.创建空操作和空控制器
// 默认的空控制器名
'empty_controller' => 'Error',
//空操作
public function _empty()
{
return '';
}
对不存在的控制器和方法进行拦截
4.在控制器中使用trait
use \traits\controller\Jump;
5.单一模块及其使用环境
// 是否支持多模块
'app_multi_module' => true,
公共操作
构造方法和初始化方法
解决了类中数据共享以及属性初始化的问题
公共控制器类
相当于在控制器类和基类之间做了一个中间类,然后通过相互继承,实现操作共享
从控制器层面解决了控制器类之间的属性和方法的共享问题。
前置操作
protected $beforeActionList=[ //前置方法列表,继承自Controller
'before1'=>'', //为空,表示before1是当前类中全部操作的前置操作
'before2'=>['only'=>'demo2'], //仅对demo2操作有效,为某一个操作设置前置操作
'before3'=>['except'=>'demo1,demo2'], //before3,仅对除demo1,demo2之外的操作有效
];
创建前置方法:
1.创建前置操作方法
2.配置前置操作列表
页面跳转与重定向
调用方法:$this->success('提示','地址')
和$this->error('提示','地址')
需要继承Controller基类
1.当前控制器
2.跨控制器
3.跨模块
4.外部地址
重定向:$this->redirect('路由地址',[变量列表],'后缀','域名开关')
1.站内地址
2.外部地址
请求对象与参数绑定
获取URL信息
$request = Request::instance();
// 获取当前域名
echo 'domain: ' . $request->domain() . '<br/>';
// 获取当前入口文件
echo 'file: ' . $request->baseFile() . '<br/>';
// 获取当前URL地址 不含域名
echo 'url: ' . $request->url() . '<br/>';
// 获取包含域名的完整URL地址
echo 'url with domain: ' . $request->url(true) . '<br/>';
// 获取当前URL地址 不含QUERY_STRING
echo 'url without query: ' . $request->baseUrl() . '<br/>';
// 获取URL访问的ROOT地址
echo 'root:' . $request->root() . '<br/>';
// 获取URL访问的ROOT地址
echo 'root with domain: ' . $request->root(true) . '<br/>';
// 获取URL地址中的PATH_INFO信息
echo 'pathinfo: ' . $request->pathinfo() . '<br/>';
// 获取URL地址中的PATH_INFO信息 不含后缀
echo 'pathinfo: ' . $request->path() . '<br/>';
// 获取URL地址中的后缀信息
echo 'ext: ' . $request->ext() . '<br/>';
设置/获取 模块/控制器/操作名称
$request = Request::instance();
echo "当前模块名称是" . $request->module();
echo "当前控制器名称是" . $request->controller();
echo "当前操作名称是" . $request->action();
设置模块名称值需要向module方法中传入名称即可,同样使用于设置控制器名称和操作名称
Request::instance()->module('module_name');
获取请求参数
$request = Request::instance();
echo '请求方法:' . $request->method() . '<br/>';
echo '资源类型:' . $request->type() . '<br/>';
echo '访问ip地址:' . $request->ip() . '<br/>';
echo '是否AJax请求:' . var_export($request->isAjax(), true) . '<br/>';
echo '请求参数:';
dump($request->param());
echo '请求参数:仅包含name';
dump($request->only(['name']));
echo '请求参数:排除name';
dump($request->except(['name']));
变量获取
变量获取使用\think\Request
类的如下方法及参数:
变量类型方法('变量名/变量修饰符','默认值','过滤方法')
方法 | 描述 |
---|---|
param | 获取当前请求的变量 |
get | 获取 $_GET 变量 |
post | 获取 $_POST 变量 |
put | 获取 PUT 变量 |
delete | 获取 DELETE 变量 |
session | 获取 $_SESSION 变量 |
cookie | 获取 $_COOKIE 变量 |
request | 获取 $_REQUEST 变量 |
server | 获取 $_SERVER 变量 |
env | 获取 $_ENV 变量 |
route | 获取 路由(包括PATHINFO) 变量 |
file | 获取 $_FILES 变量 |
请求对象的属性注入和方法注入
1.属性注入:\think\Request::instance()->属性
2.方法注入:\think\Request::hook('方法','对应函数')
作用:给当前请求对象绑定属性和方法,请求对象在应用的整个生命周期内都是有效的,不仅可以被当前所以控制器方法所共享,还可以跨控制器和模块进行调用。
请求对象的属性和方法注入,不仅可以扩展请求对象的功能,实现整个应用周期的信息共享,而且它还为自定义请求的行为制定了标准。
对象的依赖注入
ThinkPHP的依赖注入(也称之为控制反转)是一种较为轻量的实现,无需任何的配置,并且主要针对访问控制器进行依赖注入。可以在控制器的构造函数或者操作方法(指访问请求的方法)中类型声明任何(对象类型)依赖,这些依赖会被自动解析并注入到控制器实例或方法中。
自动注入请求对象
①架构方法注入
namespace app\index\controller;
use think\Request;
class Index
{
protected $request;
public function __construct(Request $request)
{
$this->request = $request;
}
public function hello()
{
return 'Hello,' . $this->request->param('name') . '!';
}
}
②操作方法注入
控制器的操作方法中如果需要调用请求对象Request的话,可以在方法中定义Request类型的参数,并且参数顺序无关,例如:
namespace app\index\controller;
use think\Request;
class Index
{
public function hello(Request $request)
{
return 'Hello,' . $request->param('name') . '!';
}
}
访问URL地址的时候 无需传入request参数,系统会自动注入当前的Request对象实例到该参数。
如果继承了系统的Controller类的话,也可以直接调用request属性,例如:
<?php
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
public function hello()
{
return 'Hello,'.$this->request->param('name');
}
}