thinkphp5——控制器与请求

  • Post author:
  • Post category:php

一 控制器

ThinkPHP V5.0的控制器定义比较灵活,可以无需继承任何的基础类,也可以继承官方封装的\think\Controller类或者其他的控制器类。

\think\Controller 控制器的5个属性和8个方法

5个属性

1 视图类实例对象protected $view

class Index extends Controller
{
     $this->view->assign('user','a');
      
     $this->view->fetch();
}

2 请求类实例对象protected $request

class Index extends Controller
{
    $this->request->ip();  //获取请求ip
}

3 验证失败是否抛出异常protected $failException = false

4 是否开启批量验证 protected $batchValidate

5 前置方法列表 protected $beforeActionList

指定某个方法为其他方法的前置操作,数组键名为需要调用的前置方法名,无值的话为当前控制器下所有方法的前置方法

['except' => '方法名,方法名'] //表示这些方法不使用前置方法,
 
['only' => '方法名,方法名']   //表示只有这些方法使用前置方法。

class Index extends Controller{
 
//first是所有方法的前置方法(其它方法在访问时会触发first方法)
 
//second是所有方法(除了hello方法)的前置方法(其它方法在访问时会触发second方法)
 
//three是hello,data方法的前置方法(hello,data方法在访问时会触发three方法)
 
    protected $beforeActionList = [
     
        'first',
         
        'second' =>  ['except'=>'hello'],
         
        'three'  =>  ['only'=>'hello,data'],
         
    ];
     
    protected function first(){}
     
    protected function second(){}
     
    protected function three(){}
 
    public function hello(){}
     
    public function data(){}
}

 

8 个方法:

1 构造方法 __construct()

2 初始化函数 __initialize()

3 加载模板 fetch()

public function index()
{
    return this->fetch();  //返回视图模板
}

5 初始化模板引擎 engine()

使用tp5自带的模板引擎,也可以使用Smarty或其它模板引擎

6 模板变量赋值 assign()

5 初始化模板引擎 engine()

使用tp5自带的模板引擎,也可以使用Smarty或其它模板引擎

6 模板变量赋值 assign()

7 验证失败抛出异常 validateFailException

8 验证数据 validate(见 验证)
 

跳转与重定向

两个跳转方法 success error,用于页面跳转提示

跳转地址是可选的,success方法的默认跳转地址是$_SERVER["HTTP_REFERER"],error方法的默认跳转地址是javascript:history.back(-1)

可以使用项目内部的模板文件

//默认错误跳转对应的模板文件'dispatch_error_tmpl' => 'public/error',     //view/public/error
 
//默认成功跳转对应的模板文件'dispatch_success_tmpl' => 'public/success',      //view/public/success

模板文件可以使用模板标签,并且可以使用下面的模板变量:

 

变量 含义
       $data  要返回的数据
       $msg  页面提示信息
       $code  返回的code
       $wait  跳转等待时间 单位为秒
       $url  跳转页面地址

重定向

\think\Controller类的redirect方法可以实现页面的重定向功能

//重定向到News模块的Category操作
 
$this->redirect('News/category', ['cate_id' => 2]);


空操作

空操作是指系统在找不到指定的操作方法的时候,会定位到空操作(_empty)方法来执行,利用这个机制,我们可以实现错误页面和一些URL的优化

空控制器

空控制器的概念是指当系统找不到指定的控制器名称的时候,系统会尝试定位空控制器(Error),利用这个机制我们可以用来定制错误页面和进行URL的优化

二 请求

如果要获取当前的请求信息,可以使用\think\Request类,如果在控制器(继承了think\Controller)里直接调用属性request($this->request)

获取URL信息

$request = Request::instance();
 
echo 'domain: ' . $request->domain();                // 获取当前域名
 
echo 'file: ' . $request->baseFile();                // 获取当前入口文件
 
echo 'url: ' . $request->url();                      // 获取当前URL地址 不含域名
 
echo 'url with domain: ' . $request->url(true);      // 获取包含域名的完整URL地址
 
echo 'url without query: ' . $request->baseUrl();    // 获取当前URL地址 不含QUERY_STRING
 
echo 'root:' . $request->root();                     // 获取URL访问的ROOT地址
 
echo 'root with domain: ' . $request->root(true);    // 获取URL访问的ROOT地址
 
echo 'pathinfo: ' . $request->pathinfo();            // 获取URL地址中的PATH_INFO信息
 
echo 'pathinfo: ' . $request->path();                // 获取URL地址中的PATH_INFO信息 不含后缀
 
echo 'ext: ' . $request->ext();                      // 获取URL地址中的后缀信息

设置/获取 模块/控制器/操作名称

$request = Request::instance();
 
echo "当前模块名称是" . $request->module();
 
echo "当前控制器名称是" . $request->controller();
 
echo "当前操作名称是" . $request->action();

获取请求参数

$request = Request::instance();
 
echo '请求方法:' . $request->method();
 
echo '资源类型:' . $request->type();
 
echo '访问ip地址:' . $request->ip();
 
echo '是否AJax请求:' . var_export($request->isAjax(), true);
 
echo '请求参数:';dump($request->param());
 
echo '请求参数:仅包含name';dump($request->only(['name']));
 
echo '请求参数:排除name';dump($request->except(['name']));

检测变量是否设置

可以使用has方法来检测一个变量参数是否设置

Request::instance()->has('id','get');
 
Request::instance()->has('name','post');
 
//或者使用助手函数
 
input('?get.id');
 
input('?post.name');

变量获取

变量类型方法包括

例 获取PARAM变量

Request::instance()->param('name');       // 获取当前请求的name变量
 
Request::instance()->param();             // 获取当前请求的所有变量(经过过滤)
 
Request::instance()->param(false);        // 获取当前请求的所有变量(原始数据)
 
Request::instance()->param(true);         // 获取当前请求的所有变量(包含上传文件)
 
使用助手函数实现
 
input('param.name');

 获取请求类型

if (Request::instance()->isGet()) echo "当前为 GET 请求";         // 是否为 GET 请求     
if (Request::instance()->isPost()) echo "当前为 POST 请求";        // 是否为 POST 请求    
if (Request::instance()->isPut()) echo "当前为 PUT 请求";          // 是否为 PUT 请求    
if (Request::instance()->isDelete()) echo "当前为 DELETE 请求";    // 是否为 DELETE 请求    
if (Request::instance()->isAjax()) echo "当前为 Ajax 请求";        // 是否为 Ajax 请求    
if (Request::instance()->isPjax()) echo "当前为 Pjax 请求";        // 是否为 Pjax 请求    
if (Request::instance()->isMobile()) echo "当前为手机访问";          // 是否为手机访问    
if (Request::instance()->isHead()) echo "当前为 HEAD 请求";        // 是否为 HEAD 请求    
if (Request::instance()->isPatch()) echo "当前为 PATCH 请求";      // 是否为 Patch 请求    
if (Request::instance()->isOptions()) echo "当前为 OPTIONS 请求";
if  (Request::instance()->isCli()) echo "当前为 cli";                // 是否为 cliif 
if  (Request::instance()->isCgi()) echo "当前为 cgi";                // 是否为 cgiif

可以使用Request对象的header方法获取当前请求的HTTP 请求头信息

$info = Request::instance()->header();
 
echo $info['accept'];
 
echo $info['accept-encoding'];
 
echo $info['user-agent'];

方法注入 如果需要在Request请求对象中添加自己的方法,可以使用Request对象的方法注入功能

// 通过hook方法注入动态方法Request::hook('user','getUserInfo');
getUserInfo函数定义如下
 
function getUserInfo(Request $request, $userId){
    // 根据$userId获取用户信息
    return $info; 
}

我们可以直接在控制器中使用

public function index(){
    $info = Request::instance()->user($userId);
}

可以动态注入当前Request对象的属性

// 动态绑定属性
Request::instance()->bind('user',new User);
// 或者使用
Request::instance()->user = new User;

获取绑定的属性使用下面的方式

Request::instance()->user;

参数绑定

tp5默认的参数绑定是按名称绑定即url上以名值对方式对应

// URL参数方式改成顺序解析'
 
url_param_type'         => 1,

 


版权声明:本文为qq_41179401原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。