TP6手册理解之架构·容器和依赖注入
依赖注入其实本质上是指对类的依赖通过构造器完成自动注入,例如在控制器架构方法和操作方法中一旦对参数进行对象类型约束则会自动触发依赖注入,由于访问控制器的参数都来自于URL请求,普通变量就是通过参数绑定自动获取,对象变量则是通过依赖注入生成。
·
一、TP已封装好,可直接使用的场景(包括但不限于)
- 控制器架构方法;
- 控制器操作方法;
- 路由的闭包定义;
- 事件类的执行方法;
- 中间件的执行方法;
案例
<?php
namespace app\controller;
use think\Request;
class Index
{
protected $request;
public function __construct(Request $request)
{
$this->request = $request;
}
public function hello($name)
{
return 'Hello,' . $name . '!This is '. $this->request->action();
}
}
二、自定义类
对于自定义的类以及方法,如果需要使用依赖注入,需要使用系统提供的invoke助手函数调用
案例1(invoke)
// app\index\controller下的Test控制器
<?php
namespace app\index\controller;
class Test
{
public function index(){
$A = invoke('app\index\myextend\A001'); // 使用TP的助手函数invoke调用参数为类名非同级文件需要带上命名空间
$result = $A->outB001test();
return $result;
}
}
?>
// app\index\myextend下的A001自定义类(使用依赖注入)
<?php
namespace app\index\myextend;
use think\Request;
use app\index\myextend\B001;
class A001
{
protected $request;
protected $b001;
// 参数模式为 (类名 变量名, 如果没有use则使用带命名空间的完整类名 变量名) => (Request $request, app\index\myextend\B001 $b001)
public function __construct(Request $request, B001 $b001)
{
$this->request = $request;
$this->b001 = $b001;
}
public function outB001test(){
return $this->b001->test(); // 调用B001类里的test函数
}
}
?>
// app\index\myextend下的A001自定义类(被注入到A001的类)
<?php
namespace app\index\myextend;
class B001
{
public function __construct()
{
echo PHP_EOL.'This is "app/index/myextend/B001 __construct"<br />'.PHP_EOL;
}
public function test(){
return 'B001->test()';
}
}
?>
案例2(app和bind用法|绑定)
使用app助手函数进行容器中的类解析调用,对于已经绑定的类标识,会自动快速实例化;使用app助手函数获取容器中的对象实例(支持依赖注入)
// app\index\controller下的Test控制器
<?php
namespace app\index\controller;
class Test
{
public function index(){
bind('A001', 'app\index\myextend\A001');
$result = app('A001')->outB001test();
return $result;
}
}
?>
参考资料
更多推荐
已为社区贡献1条内容
所有评论(0)