类 yii\di\Instance
继承 | yii\di\Instance |
---|---|
可用版本 | 2.0 |
源代码 | https://github.com/yiisoft/yii2/blob/master/framework/di/Instance.php |
Instance 代表依赖注入 (DI) 容器或服务定位器中命名对象的引用。
Instance 主要用于以下两个地方
- 在配置依赖注入容器时,您使用 Instance 来引用类名、接口名或别名。该引用随后可由容器解析为实际对象。
- 在使用服务定位器获取依赖对象的类中。
以下示例展示了如何使用 Instance 配置 DI 容器
$container = new \yii\di\Container;
$container->set('cache', [
'class' => 'yii\caching\DbCache',
'db' => Instance::of('db')
]);
$container->set('db', [
'class' => 'yii\db\Connection',
'dsn' => 'sqlite:path/to/file.db',
]);
以下示例展示了类如何从服务定位器中检索组件
class DbCache extends Cache
{
public $db = 'db';
public function init()
{
parent::init();
$this->db = Instance::ensure($this->db, 'yii\db\Connection');
}
}
公共属性
属性 | 类型 | 描述 | 定义于 |
---|---|---|---|
$id | string | 组件 ID、类名、接口名或别名 | yii\di\Instance |
$optional | boolean | 如果应返回 null 而不是抛出异常 | yii\di\Instance |
公共方法
方法 | 描述 | 定义于 |
---|---|---|
__set_state() | 使用 var_export() 后恢复类状态。 |
yii\di\Instance |
ensure() | 将指定的引用解析为实际对象并确保其为指定的类型。 | yii\di\Instance |
get() | 返回此 Instance 对象引用的实际对象。 | yii\di\Instance |
of() | 创建一个新的 Instance 对象。 | yii\di\Instance |
属性详细信息
方法详细信息
构造函数。
protected void __construct ( $id, $optional = false ) | ||
$id | string |
组件 ID |
$optional | boolean |
如果应返回 null 而不是抛出异常 |
protected function __construct($id, $optional = false)
{
$this->id = $id;
$this->optional = $optional;
}
使用 var_export()
后恢复类状态。
public static yii\di\Instance __set_state ( $state ) | ||
$state | array | |
抛出 | yii\base\InvalidConfigException |
当 $state 属性不包含 |
---|
public static function __set_state($state)
{
if (!isset($state['id'])) {
throw new InvalidConfigException('Failed to instantiate class "Instance". Required parameter "id" is missing');
}
return new self($state['id']);
}
将指定的引用解析为实际对象并确保其为指定的类型。
引用可以指定为字符串或 Instance 对象。如果前者,则根据容器类型将其视为组件 ID、类/接口名或别名。
如果您未指定容器,则该方法将首先尝试 Yii::$app
,然后尝试 Yii::$container
。
例如:
use yii\db\Connection;
// returns Yii::$app->db
$db = Instance::ensure('db', Connection::class);
// returns an instance of Connection using the given configuration
$db = Instance::ensure(['dsn' => 'sqlite:path/to/my.db'], Connection::class);
public static object ensure ( $reference, $type = null, $container = null ) | ||
$reference | object|string|array|static |
对象或对所需对象的引用。您可以使用组件 ID 或 Instance 对象指定引用。从版本 2.0.2 开始,您也可以传递配置数组以创建对象。如果配置数组中未指定“class”值,它将使用 |
$type | string|null |
要检查的类/接口名称。如果为 null,则不执行类型检查。 |
$container | yii\di\ServiceLocator|yii\di\Container|null |
容器。这将传递给 get()。 |
返回 | 对象 |
Instance 引用的对象,如果它是一个对象,则为 |
---|---|---|
抛出 | yii\base\InvalidConfigException |
如果引用无效 |
public static function ensure($reference, $type = null, $container = null)
{
if (is_array($reference)) {
$class = isset($reference['class']) ? $reference['class'] : $type;
if (!$container instanceof Container) {
$container = Yii::$container;
}
unset($reference['class']);
$component = $container->get($class, [], $reference);
if ($type === null || $component instanceof $type) {
return $component;
}
throw new InvalidConfigException('Invalid data type: ' . $class . '. ' . $type . ' is expected.');
} elseif (empty($reference)) {
throw new InvalidConfigException('The required component is not specified.');
}
if (is_string($reference)) {
$reference = new static($reference);
} elseif ($type === null || $reference instanceof $type) {
return $reference;
}
if ($reference instanceof self) {
try {
$component = $reference->get($container);
} catch (\ReflectionException $e) {
throw new InvalidConfigException('Failed to instantiate component or class "' . $reference->id . '".', 0, $e);
}
if ($type === null || $component instanceof $type) {
return $component;
}
throw new InvalidConfigException('"' . $reference->id . '" refers to a ' . get_class($component) . " component. $type is expected.");
}
$valueType = is_object($reference) ? get_class($reference) : gettype($reference);
throw new InvalidConfigException("Invalid data type: $valueType. $type is expected.");
}
返回此 Instance 对象引用的实际对象。
public object get ( $container = null ) | ||
$container | yii\di\ServiceLocator|yii\di\Container|null |
用于查找引用对象的容器。如果为 null,则该方法将首先尝试 |
返回 | 对象 |
此 Instance 对象引用的实际对象。 |
---|
public function get($container = null)
{
try {
if ($container) {
return $container->get($this->id);
}
if (Yii::$app && Yii::$app->has($this->id)) {
return Yii::$app->get($this->id);
}
return Yii::$container->get($this->id);
} catch (\Exception $e) {
if ($this->optional) {
return null;
}
throw $e;
} catch (\Throwable $e) {
if ($this->optional) {
return null;
}
throw $e;
}
}
创建一个新的 Instance 对象。
public static yii\di\Instance of ( $id, $optional = false ) | ||
$id | string |
组件 ID |
$optional | boolean |
如果应返回 null 而不是抛出异常 |
返回 | yii\di\Instance |
新的 Instance 对象。 |
---|
public static function of($id, $optional = false)
{
return new static($id, $optional);
}
注册 或 登录 才能评论。