thinkphp6.0--容器和依赖注入


声明:这是看官方文档写的笔记,可以说是抄了一遍吧,加深印象和加深理解。

======================================================================================================

容器和依赖注入

_________________________________________________________________________________________________________________________________________

ThinkPHP使用容器来更方便得管理类依赖以及运行依赖注入,新版的容器支持PSR-11规范。

容器类的工作由 think\Container 类完成,但大多数情况我们只需要通过 app 助手函数或者 think\App 类即可容器操作,如果在服务类中可以直接调用 this->app 进行容器操作。

依赖注入其本质上指对类的依赖通过构造器完成自动注入,例如在控制器架构方法和操作方法中一旦对参数进行对象类型约束则会自动触发依赖注入,由于访问控制器的参数都来自于URL请求,普通变量就是通过参数绑定自动获取,对象变量则是通过依赖注入生成。

<?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 助手函数调用,例如:

class Foo
{
    public function __construct(Bar $bar)
    {

    }
}

如果直接 new 的话,需要手动传入 Bar 对象实例

$bar = new Bar();
$foo = new Foo($bar);

如果使用容器来实例化的话,可以自动进行依赖注入。

$foo = invoke('Foo');

如果要对某个方法支持依赖注入,可以使用

class Foo
{
    public function bar(Bar $bar)
    {
    }
}
$result = invoke(['Foo','bar']);

也支持对某个函数或闭包使用依赖注入

$result = invoke(function (Bar $bar){

});

_________________________________________________________________________________________________________________________________________

绑定

_________________________________________________________________________________________________________________________________________

依赖注入的类统一由容器进行管理,大多数情况下是在自动绑定并且实例化的。不过你可以随时进行手动绑定类到容器中(通常是在服务类的 register 方法中进行绑定),支持多种绑定方式。

绑定标识

可以对已有的类库绑定一个标识(唯一),便于快速调用。

// 绑定类库标识
$this->app->bind('think\Cache','app\common\Cache');

或者使用助手函数

// 绑定类库标识
bind('cache','think\Cache');

绑定类标识可以自己定义(只要不冲突)

绑定闭包

可以绑定一个闭包到容器中

bind('sayHello',function ($name){
   return 'hello,' . $name;
});

绑定实例

也可以直接绑定一个类的实例

$cache = new think\Cache;
// 绑定类实例
bind('cache',$cache);

绑定至接口实现

对于依赖注入使用接口类的情况,我们需要告诉系统使用哪个具体的接口实现类来,不写了,犯困!

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM