美文网首页ThinkPhp5入门
TP5的请求对象的属性与方法注入

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

作者: 傲娇的泰迪 | 来源:发表于2018-01-12 09:06 被阅读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();
      }
    }
    ?>
    

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

    相关文章

      网友评论

        本文标题:TP5的请求对象的属性与方法注入

        本文链接:https://www.haomeiwen.com/subject/rslznxtx.html