ThinkPhp5入门

TP5的请求对象的属性与方法注入

2018-01-12  本文已影响0人  傲娇的泰迪

1、属性注入:\think\Request::instance()->属性

2、方法注入:\think\Request::hook('方法','对应函数')

作用:给当前请求对象绑定属性和方法,请求对象在应用的整个生命周期内都有效,不仅可以被当前所有控制器方法所共享,还可以跨控制器和模块进行调用。

app\index\index.php中的内容:

<?php
namespace app\index\controller
class Index extends \think\Controller
{
  public function index()
  {
    return '<h2>欢迎来到PHP中文网</h2>';
  } 
  public function demo1($name)
  {
    return $name; //可以返回$name
  }
  public function demo2() //这里没有传入$name
  {
    return $name; //所以无法返回$name
  }
}
?>

更改:

<?php
namespace app\index\controller
class Index extends \think\Controller
{
  public function index()
  {
    return '<h2>欢迎来到PHP中文网</h2>';
  } 
  public function demo1($name)
  {
    return $this->request->param('name'); //可以返回$name
  }
  public function demo2() //这里没有传入$name
  {
    return $this->request->param('name'); //可以返回$name
  }
}
?>

所以,通过调用请求对象中的某一个方法,可以实现请求变量的共享。

但是,当跨控制器、跨模块时,也是不能用的。

比如,在controller中新建Demo.php文件:

<?php
namespace app\index\controller
class Demo extends \think\Controller
{
  public function hello()
  {
    if($this->request->has('name','get')){
      return $this->request->param('name');
    } else {
      return '不存在';
    }
  }
}
?>

这时,会显示不存在。
我们可以使用对象注入的方式解决。

给请求对象注入的自定义属性与方法,与原请求对象中的属性与方法是同级的,所以在整个应用的生命周期内都是有效的。

首先,在当前应用的common.php文件中:

<?php
use think\Request;
$request = Request::instance();
//请求对象的属性注入
$request->siteName = 'PHP中文网';
?>

//请求对象的方法注入
function getSiteName(Request $request) //第一个参数必须是Request类型的变量
{
  return '站点名称:'.$request->siteName;
}
//注册请求对象的方法,也叫钩子
Request::hook('getSiteName','getiSiteName');

然后在index.php中:

<?php
namespace app\index\controller
class Index extends \think\Controller
{
  public function index()
  {
    return '<h2>欢迎来到PHP中文网</h2>';
  } 
  public function demo1()
  {
    return $this->request->siteName; 
  }
  public function demo2() 
  {
    return $this->request->getSiteName(); 
  }
}
?>

可以使用。
那再试试把demo1和demo2复制进Demo.php从,看看能不能跨控制器使用:

<?php
namespace app\index\controller
class Demo extends \think\Controller
{
  public function demo1()
  {
    return $this->request->siteName;
  }
  public function demo2()
  {
    return $this->request->getSiteName();
  }
}
?>

测试成功
同理,在其他模块里也能用。

上一篇 下一篇

猜你喜欢

热点阅读