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();
}
}
?>
测试成功
同理,在其他模块里也能用。