没有命名空间的类 yii yii\base yii\behaviors yii\caching yii\captcha yii\console yii\console\controllers yii\console\widgets yii\data yii\db yii\db\conditions yii\db\cubrid yii\db\cubrid\conditions yii\db\mssql yii\db\mssql\conditions yii\db\mysql yii\db\oci yii\db\oci\conditions yii\db\pgsql yii\db\sqlite yii\db\sqlite\conditions yii\di yii\filters yii\filters\auth yii\grid yii\helpers yii\i18n yii\log yii\mail yii\mutex yii\rbac yii\rest yii\test yii\validators yii\web yii\widgets

Class yii\di\Container

继承yii\di\Container » yii\base\Component » yii\base\BaseObject
实现yii\base\Configurable
可用版本自2.0
源码 https://github.com/yiichina/yii2/blob/api/framework/di/Container.php

Container 实现 依赖注入 容器。

依赖注入(DI)容器是一个知道如何实例化和配置对象 以及其所有依赖对象的对象。想要了解更多关于 DI 的信息,请参考 Martin Fowler 的文章

Container 支持构造函数注入以及属性注入。

要使用 Container,首先需要通过调用 set() 来设置类依赖项。 然后调用 get() 去创建一个新的类对象。 Container 将自动实例化依赖对象,将它们注入正在创建的对象,配置并且最终返回新创建的对象。

默认情况下,Yii::$container 引用 Yii::createObject() 来创建新对象实例的 Container 实例。在创建新对象时, 您可以使用此方法替换 new 运算符, 这将为您提供了自动依赖项解析和默认属性配置的便利。

下面是使用 Container 的一个例子:

namespace app\models;

use yii\base\BaseObject;
use yii\db\Connection;
use yii\di\Container;

interface UserFinderInterface
{
    function findUser();
}

class UserFinder extends BaseObject implements UserFinderInterface
{
    public $db;

    public function __construct(Connection $db, $config = [])
    {
        $this->db = $db;
        parent::__construct($config);
    }

    public function findUser()
    {
    }
}

class UserLister extends BaseObject
{
    public $finder;

    public function __construct(UserFinderInterface $finder, $config = [])
    {
        $this->finder = $finder;
        parent::__construct($config);
    }
}

$container = new Container;
$container->set('yii\db\Connection', [
    'dsn' => '...',
]);
$container->set('app\models\UserFinderInterface', [
    'class' => 'app\models\UserFinder',
]);
$container->set('userLister', 'app\models\UserLister');

$lister = $container->get('userLister');

// which is equivalent to:

$db = new \yii\db\Connection(['dsn' => '...']);
$finder = new UserFinder($db);
$lister = new UserLister($finder);

想要获取更多关于 Container 的细节和用法,请参阅 guide article on di-containers

公共属性

隐藏继承的属性

属性类型描述被定义在
$behaviors yii\base\Behavior[] List of behaviors attached to this component yii\base\Component
$definitions array 对象定义列表或加载的共享对象(type or ID => definition or instance)。 yii\di\Container
$singleton string 类名,接口名或别名 yii\di\Container
$singletons array 定义单例的数组。 有关允许的数组格式,请参阅 setDefinitions() yii\di\Container

公共方法

隐藏继承的方法

方法描述被定义在
__call() Calls the named method which is not a class method. yii\base\Component
__clone() This method is called after the object is created by cloning an existing one. yii\base\Component
__construct() Constructor. yii\base\BaseObject
__get() Returns the value of a component property. yii\base\Component
__isset() Checks if a property is set, i.e. defined and not null. yii\base\Component
__set() Sets the value of a component property. yii\base\Component
__unset() Sets a component property to be null. yii\base\Component
attachBehavior() Attaches a behavior to this component. yii\base\Component
attachBehaviors() Attaches a list of behaviors to the component. yii\base\Component
behaviors() Returns a list of behaviors that this component should behave as. yii\base\Component
canGetProperty() Returns a value indicating whether a property can be read. yii\base\Component
canSetProperty() Returns a value indicating whether a property can be set. yii\base\Component
className() Returns the fully qualified name of this class. yii\base\BaseObject
clear() 删除指定名称的定义。 yii\di\Container
detachBehavior() Detaches a behavior from the component. yii\base\Component
detachBehaviors() Detaches all behaviors from the component. yii\base\Component
ensureBehaviors() Makes sure that the behaviors declared in behaviors() are attached to this component. yii\base\Component
get() 返回所请求类的实例。 yii\di\Container
getBehavior() Returns the named behavior object. yii\base\Component
getBehaviors() Returns all behaviors attached to this component. yii\base\Component
getDefinitions() 返回对象定义列表或加载的共享对象。 yii\di\Container
has() 返回一个指示容器是否具有指定名称的定义的值。 yii\di\Container
hasEventHandlers() Returns a value indicating whether there is any handler attached to the named event. yii\base\Component
hasMethod() Returns a value indicating whether a method is defined. yii\base\Component
hasProperty() Returns a value indicating whether a property is defined for this component. yii\base\Component
hasSingleton() 返回一个指示给定名称是否对应于已注册的单例的值。 yii\di\Container
init() Initializes the object. yii\base\BaseObject
invoke() 通过解析参数中的依赖项来调用回调。 yii\di\Container
off() Detaches an existing event handler from this component. yii\base\Component
on() Attaches an event handler to an event. yii\base\Component
resolveCallableDependencies() 解决函数的依赖关系。 yii\di\Container
set() 使用容器注册类的定义。 yii\di\Container
setDefinitions() 在容器中注册类定义。 yii\di\Container
setSingleton() 使用容器注册类定义并将该类标记为单例类。 yii\di\Container
setSingletons() 通过调用 setSingleton() 将类定义注册为容器的单例 yii\di\Container
trigger() Triggers an event. yii\base\Component

受保护的方法

隐藏继承的方法

方法描述被定义在
build() 创建指定类的实例。 此方法将解析指定类的依赖关系,实例化它们, 并且将它们注入到指定类的新实例中。 yii\di\Container
getDependencies() 返回指定类的依赖项。 yii\di\Container
mergeParams() 将用户指定的构造函数的参数和通过 set() 注册的参数合并。 yii\di\Container
normalizeDefinition() 规范化类定义。 yii\di\Container
resolveDependencies() 通过将依赖项替换为实际对象实例来解析依赖关系。 yii\di\Container

属性详情

$definitions 公共 属性

对象定义列表或加载的共享对象(type or ID => definition or instance)。

public array getDefinitions ( )
public void setDefinitions ( array $definitions )
$singleton 公共 只写 属性

类名,接口名或别名

public $this setSingleton ( $class, $definition = [], array $params = [] )
$singletons 公共 只写 属性

定义单例的数组。 有关允许的数组格式,请参阅 setDefinitions()

public void setSingletons ( array $singletons )

方法详情

build() 受保护 方法

创建指定类的实例。 此方法将解析指定类的依赖关系,实例化它们, 并且将它们注入到指定类的新实例中。

protected object build($class, $params, $config)
$class string

类名

$params array

构造函数的参数

$config array

引用于新实例的配置

return object

新创建的指定类的实例

throws yii\di\NotInstantiableException

从 2.0.9 版本开始,如果解析为抽象类或接口抛出的异常

clear() 公共 方法

删除指定名称的定义。

public void clear($class)
$class string

类名,接口名或者别名。

get() 公共 方法

返回所请求类的实例。

你可以提供构造函数参数 ($params) 和对象配置 ($config), 这些参数将在创建实例期间使用。

如果类实现 yii\base\Configurable,则 $config 参数将作为最后一个参数 传递给构造函数;否则, 配置将在对象被实例化 之后 被应用。

注意如果通过调用 setSingleton() 将类声明为单例, 则每次调用此方法时都将返回该类的相同实例。 在这种情况下, 只有在第一次实例化类时,才会使用构造函数参数和对象配置。

public object get($class, $params = [], $config = [])
$class string

先前通过 set()setSingleton() 注册的类名或别名(e.g. foo)。

$params array

构造函数参数值列表。 参数应该按照它们在构造函数声明中出现的顺序提供。 如果你想略过某些参数,你应该将剩下的索引用整数表示它们在构造函数参数列表中的位置。

$config array

将用于初始化对象属性的名键值对的列表。

return object

请求类的实例。

throws yii\base\InvalidConfigException

如果类不能识别或对应于无效定抛出的异常

throws yii\di\NotInstantiableException

从 2.0.9 版本开始,如果解析为抽象类或接口抛出的异常

getDefinitions() 公共 方法

返回对象定义列表或加载的共享对象。

public array getDefinitions()
return array

对象定义列表或加载的共享对象(type or ID => definition or instance)。

getDependencies() 受保护 方法

返回指定类的依赖项。

protected array getDependencies($class)
$class string

类名,接口名或别名

return array

指定类的依赖关系。

throws yii\base\InvalidConfigException

如果无法解决依赖关系或无法实现依赖关系抛出的异常。

has() 公共 方法

返回一个指示容器是否具有指定名称的定义的值。

参见 set().

public boolean has($class)
$class string

类名,接口名或别名

return boolean

Whether 容器是否有具有指定名称的定义.

hasSingleton() 公共 方法

返回一个指示给定名称是否对应于已注册的单例的值。

public boolean hasSingleton($class, $checkInstance false)
$class string

类名,接口名或别名。

$checkInstance boolean

是否检查单例是否已实例化。

return boolean

给定名称是否已注册了单例。 如果 $checkInstance 为真,该方法应返回一个值,表明单例是否已实例化。

invoke() 公共 方法 (自版本 2.0.7 可用)

通过解析参数中的依赖项来调用回调。

此方法允许调用回调并将类型提示的参数名称解析为 Container 的对象。 它还允许使用命名参数调用函数。

例如,可以使用 Container 调用以下回调来解析格式化程序依赖项:

$formatString = function($string, \yii\i18n\Formatter $formatter) {
   // ...
}
Yii::$container->invoke($formatString, ['string' => 'Hello World!']);

这将传递字符串 'Hello World!' 作为第一个参数, 以及由 DI 创建的格式化程序实例作为回调的第二个参数。

public mixed invoke(callable $callback, $params = [])
$callback callable

需要调用的回调。

$params array

函数的参数数组。 这可以是参数列表,也可以是表示命名函数参数的关联数组。

return mixed

回调返回的值。

throws yii\base\InvalidConfigException

如果无法解决依赖关系或无法实现依赖关系抛出的异常。

throws yii\di\NotInstantiableException

从 2.0.9 版本开始,如果解析为抽象类或接口抛出的异常

mergeParams() 受保护 方法

将用户指定的构造函数的参数和通过 set() 注册的参数合并。

protected array mergeParams($class, $params)
$class string

类名,接口名或别名

$params array

构造函数的参数

return array

合并后的参数

normalizeDefinition() 受保护 方法

规范化类定义。

protected array normalizeDefinition($class, $definition)
$class string

类名

$definition string|array|callable

类的定义

return array

规范化的类定义

throws yii\base\InvalidConfigException

如果定义无效抛出的异常。

resolveCallableDependencies() 公共 方法 (自版本 2.0.7 可用)

解决函数的依赖关系。

此方法可用于实现其他组件中 invoke() 提供的类似功能。

public array resolveCallableDependencies(callable $callback, $params = [])
$callback callable

可调用的回调函数。

$params array

函数的参数数组可以是数字的,也可以是相联的。

return array

已解决的依赖项。

throws yii\base\InvalidConfigException

如果不能解决依赖关系,或者不能满足依赖关系抛出的异常。

throws yii\di\NotInstantiableException

从 2.0.9 版本开始,如果解析为抽象类或接口抛出的异常

resolveDependencies() 受保护 方法

通过将依赖项替换为实际对象实例来解析依赖关系。

protected array resolveDependencies($dependencies, $reflection null)
$dependencies array

依赖关系

$reflection ReflectionClass

与依赖关联的类反射

return array

已解决的依赖项

throws yii\base\InvalidConfigException

如果无法解决依赖关系或无法实现依赖关系抛出的异常。

set() 公共 方法

使用容器注册类的定义。

例如:

// 按原样注册一个类名。这可以跳过。
$container->set('yii\db\Connection');

// 注册一个接口
// 当一个类依赖于接口时,
// 相应的类将被实例化为依赖对象
$container->set('yii\mail\MailInterface', 'yii\swiftmailer\Mailer');

// 注册一个别名。你可以使用 $container->get('foo')
// 去创建连接实例。
$container->set('foo', 'yii\db\Connection');

// 通过配置来注册一个类。
// 当类通过 get() 来实例化时,将应用此配置
$container->set('yii\db\Connection', [
    'dsn' => 'mysql:host=127.0.0.1;dbname=demo',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8',
]);

// 使用类配置注册别名
// 在这种情况下,需要用 "class" 来指定类
$container->set('db', [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=127.0.0.1;dbname=demo',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8',
]);

// 注册一个 PHP 回调
// 当 $container->get('db') 被调用时,回调将会执行
$container->set('db', function ($container, $params, $config) {
    return new \yii\db\Connection($config);
});

如果已经存在具有相同名称的类定义,则将使用新的类定义覆盖它。 你可以使用 has() 去检查是否类的定义已经存在。

public $this set($class, $definition = [], array $params = [])
$class string

类名,接口名或别名

$definition mixed

$class相关的定义。它可以是下列之一:

  • PHP 回调:当 get() 被触发时将会执行这个回调。 回调的方法应该是 function ($container, $params, $config),其中 $params 表示构造函数的参数列表, $config 是对象的配置,$container 是容器对象。 回调函数的返回值将由 get() 作为请求的对象实例返回。
  • 配置数组:数组包含的键值对用在调用 get() 时初始化新创建的对象的属性值。 class 元素代表要创建对象的类。 如果 class 没有指定,$class 将做为类名。
  • 字符串:一个类名,一个接口名或者一别名。
$params array

构造函数参数列表。 调用 get() 时,参数将传递给类的构造函数。

return $this

容器本身

setDefinitions() 公共 方法 (自版本 2.0.11 可用)

在容器中注册类定义。

参见 set() 了解更多关于定义可能的值.

public void setDefinitions(array $definitions)
$definitions array

定义数组。有两种允许的数组格式。 第一种格式:

  • key:类名,接口名或别名。 键将作为第一个参数 $class 来传递给 set() 方法。
  • value:与 $class 相关的定义。 在 set() 文档中描述了关于 $definition 参数可能的值。 将作为第二个参数 $definition 传递给 set()

例如:

$container->setDefinitions([
    'yii\web\Request' => 'app\components\Request',
    'yii\web\Response' => [
        'class' => 'app\components\Response',
        'format' => 'json'
    ],
    'foo\Bar' => function () {
        $qux = new Qux;
        $foo = new Foo($qux);
        return new Bar($foo);
    }
]);

第二种格式:

  • key:类名,接口名或别名。 键将作为第一个参数 $class 来传递给 set() 方法。
  • value:两个元素的数组。 第一个元素将作为第二个参数 $definition 传递给 set() 方法,第二个元素 — 作为 $params

例如:

$container->setDefinitions([
    'foo\Bar' => [
         ['class' => 'app\Bar'],
         [Instance::of('baz')]
     ]
]);
setSingleton() 公共 方法

使用容器注册类定义并将该类标记为单例类。

这个方法跟 set() 相似,除了通过此方法注册的类只有一个实例。 每次 get() 被调用时,将返回指定类的相同实例。

参见 set().

public $this setSingleton($class, $definition = [], array $params = [])
$class string

类名,接口名或别名

$definition mixed

$class 相关的定义。查看关于 set() 更多的细节。

$params array

构造函数参数的列表。 当 get() 被调用时,参数将传递给类的构造函数。

return $this

容器本身

setSingletons() 公共 方法 (自版本 2.0.11 可用)

通过调用 setSingleton() 将类定义注册为容器的单例

参见:

public void setSingletons(array $singletons)
$singletons array

定义单例的数组。 有关允许的数组格式,请参阅 setDefinitions()