ThinkPHP5.0教程学习05:TP5 控制器与请求对象

学习教程来源于:
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 变量

参考:ThinkPHP5.0 完全开发手册 请求

请求对象的属性注入和方法注入

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');
    }
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值