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 |
属性详情
对象定义列表或加载的共享对象(type or ID => definition or instance)。
类名,接口名或别名
定义单例的数组。 有关允许的数组格式,请参阅 setDefinitions()。
方法详情
创建指定类的实例。 此方法将解析指定类的依赖关系,实例化它们, 并且将它们注入到指定类的新实例中。
protected object build($class, $params, $config) | ||
$class | string | 类名 |
$params | array | 构造函数的参数 |
$config | array | 引用于新实例的配置 |
return | object | 新创建的指定类的实例 |
---|---|---|
throws | yii\di\NotInstantiableException | 从 2.0.9 版本开始,如果解析为抽象类或接口抛出的异常 |
删除指定名称的定义。
public void clear($class) | ||
$class | string | 类名,接口名或者别名。 |
返回所请求类的实例。
你可以提供构造函数参数 ($params
) 和对象配置 ($config
),
这些参数将在创建实例期间使用。
如果类实现 yii\base\Configurable,则 $config
参数将作为最后一个参数
传递给构造函数;否则,
配置将在对象被实例化 之后 被应用。
注意如果通过调用 setSingleton() 将类声明为单例, 则每次调用此方法时都将返回该类的相同实例。 在这种情况下, 只有在第一次实例化类时,才会使用构造函数参数和对象配置。
public object get($class, $params = [], $config = []) | ||
$class | string | 先前通过 set() 或
setSingleton() 注册的类名或别名(e.g. |
$params | array | 构造函数参数值列表。 参数应该按照它们在构造函数声明中出现的顺序提供。 如果你想略过某些参数,你应该将剩下的索引用整数表示它们在构造函数参数列表中的位置。 |
$config | array | 将用于初始化对象属性的名键值对的列表。 |
return | object | 请求类的实例。 |
---|---|---|
throws | yii\base\InvalidConfigException | 如果类不能识别或对应于无效定抛出的异常 |
throws | yii\di\NotInstantiableException | 从 2.0.9 版本开始,如果解析为抽象类或接口抛出的异常 |
返回对象定义列表或加载的共享对象。
public array getDefinitions() | ||
return | array | 对象定义列表或加载的共享对象(type or ID => definition or instance)。 |
---|
返回指定类的依赖项。
protected array getDependencies($class) | ||
$class | string | 类名,接口名或别名 |
return | array | 指定类的依赖关系。 |
---|---|---|
throws | yii\base\InvalidConfigException | 如果无法解决依赖关系或无法实现依赖关系抛出的异常。 |
返回一个指示容器是否具有指定名称的定义的值。
参见 set().
public boolean has($class) | ||
$class | string | 类名,接口名或别名 |
return | boolean | Whether 容器是否有具有指定名称的定义. |
---|
返回一个指示给定名称是否对应于已注册的单例的值。
public boolean hasSingleton($class, $checkInstance = false) | ||
$class | string | 类名,接口名或别名。 |
$checkInstance | boolean | 是否检查单例是否已实例化。 |
return | boolean | 给定名称是否已注册了单例。
如果 |
---|
通过解析参数中的依赖项来调用回调。
此方法允许调用回调并将类型提示的参数名称解析为 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 版本开始,如果解析为抽象类或接口抛出的异常 |
将用户指定的构造函数的参数和通过 set() 注册的参数合并。
protected array mergeParams($class, $params) | ||
$class | string | 类名,接口名或别名 |
$params | array | 构造函数的参数 |
return | array | 合并后的参数 |
---|
规范化类定义。
protected array normalizeDefinition($class, $definition) | ||
$class | string | 类名 |
$definition | string|array|callable | 类的定义 |
return | array | 规范化的类定义 |
---|---|---|
throws | yii\base\InvalidConfigException | 如果定义无效抛出的异常。 |
解决函数的依赖关系。
此方法可用于实现其他组件中 invoke() 提供的类似功能。
public array resolveCallableDependencies(callable $callback, $params = []) | ||
$callback | callable | 可调用的回调函数。 |
$params | array | 函数的参数数组可以是数字的,也可以是相联的。 |
return | array | 已解决的依赖项。 |
---|---|---|
throws | yii\base\InvalidConfigException | 如果不能解决依赖关系,或者不能满足依赖关系抛出的异常。 |
throws | yii\di\NotInstantiableException | 从 2.0.9 版本开始,如果解析为抽象类或接口抛出的异常 |
通过将依赖项替换为实际对象实例来解析依赖关系。
protected array resolveDependencies($dependencies, $reflection = null) | ||
$dependencies | array | 依赖关系 |
$reflection | ReflectionClass | 与依赖关联的类反射 |
return | array | 已解决的依赖项 |
---|---|---|
throws | yii\base\InvalidConfigException | 如果无法解决依赖关系或无法实现依赖关系抛出的异常。 |
使用容器注册类的定义。
例如:
// 按原样注册一个类名。这可以跳过。
$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 | 与 |
$params | array | 构造函数参数列表。 调用 get() 时,参数将传递给类的构造函数。 |
return | $this | 容器本身 |
---|
在容器中注册类定义。
参见 set() 了解更多关于定义可能的值.
public void setDefinitions(array $definitions) | ||
$definitions | array | 定义数组。有两种允许的数组格式。 第一种格式:
例如:
第二种格式:
例如:
|
public $this setSingleton($class, $definition = [], array $params = []) | ||
$class | string | 类名,接口名或别名 |
$definition | mixed | 与 |
$params | array | 构造函数参数的列表。 当 get() 被调用时,参数将传递给类的构造函数。 |
return | $this | 容器本身 |
---|
通过调用 setSingleton() 将类定义注册为容器的单例
参见:
- setDefinitions() 允许格式的 $singletons 参数.
- setSingleton() 了解更多关于定义可能的值.
public void setSingletons(array $singletons) | ||
$singletons | array | 定义单例的数组。 有关允许的数组格式,请参阅 setDefinitions()。 |