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

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

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

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

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

欢迎来到PHP中文网';
  } 
  public function demo1($name)
  {
    return $name; //可以返回$name
  }
  public function demo2() //这里没有传入$name
  {
    return $name; //所以无法返回$name
  }
}
?>

更改:

欢迎来到PHP中文网';
  } 
  public function demo1($name)
  {
    return $this->request->param('name'); //可以返回$name
  }
  public function demo2() //这里没有传入$name
  {
    return $this->request->param('name'); //可以返回$name
  }
}
?>

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

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

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

request->has('name','get')){
      return $this->request->param('name');
    } else {
      return '不存在';
    }
  }
}
?>

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

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

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

siteName = 'PHP中文网';
?>

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

然后在index.php中:

欢迎来到PHP中文网';
  } 
  public function demo1()
  {
    return $this->request->siteName; 
  }
  public function demo2() 
  {
    return $this->request->getSiteName(); 
  }
}
?>

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

request->siteName;
  }
  public function demo2()
  {
    return $this->request->getSiteName();
  }
}
?>

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

你可能感兴趣的:(TP5的请求对象的属性与方法注入)