Class yii\di\ServiceLocator

继承yii\di\ServiceLocator » yii\base\Component » yii\base\BaseObject
实现yii\base\Configurable
子类yii\base\Application, yii\base\Module, yii\console\Application, yii\web\Application
可用自版本2.0
源代码 https://github.com/yiisoft/yii2/blob/master/framework/di/ServiceLocator.php

ServiceLocator 实现了一个 服务定位器.

要使用 ServiceLocator, 首先需要通过调用 set()setComponents() 向定位器注册具有相应组件定义的组件ID. 然后, 你可以调用 get() 来检索具有指定ID的组件. 定位器将根据定义自动实例化和配置组件.

例如,

$locator = new \yii\di\ServiceLocator;
$locator->setComponents([
    'db' => [
        'class' => 'yii\db\Connection',
        'dsn' => 'sqlite:path/to/file.db',
    ],
    'cache' => [
        'class' => 'yii\caching\DbCache',
        'db' => 'db',
    ],
]);

$db = $locator->get('db');  // or $locator->db
$cache = $locator->get('cache');  // or $locator->cache

由于 yii\base\Module 扩展自 ServiceLocator, 模块(module)和应用程序(application)都是服务定位器. 模块添加 tree traversal 以进行服务解析.

有关 ServiceLocator 的更多详细信息和使用信息, 请参阅 权威指南 - 关键概念 - 服务定位器(Service Locator).

公共属性

隐藏继承的属性

属性类型描述定义在
$behaviors yii\base\Behavior[] 附加到此组件的行为列表. 该属性是只读的. yii\base\Component
$components array 组件定义列表或已加载的组件实例(ID => 定义或实例). yii\di\ServiceLocator

公共方法

隐藏继承的方法

方法描述定义在
__call() 调用不是类方法的指定的方法. yii\base\Component
__clone() 在通过克隆现有对象创建对象之后调用此方法. yii\base\Component
__construct() 构造函数. yii\base\BaseObject
__get() Getter 魔术方法. yii\di\ServiceLocator
__isset() 检查属性值是否为null. yii\di\ServiceLocator
__set() 设置组件属性的值. yii\base\Component
__unset() 将组件属性设置为null. yii\base\Component
attachBehavior() 将行为附加到此组件. yii\base\Component
attachBehaviors() 将行为列表附加到组件. yii\base\Component
behaviors() 返回此组件应该具有的行为列表. yii\base\Component
canGetProperty() 返回一个值, 指示属性是否可读取. yii\base\Component
canSetProperty() 返回一个值, 指示属性是否可设置. yii\base\Component
className() 返回此类的完全限定名称. yii\base\BaseObject
clear() 从定位器中移除组件. yii\di\ServiceLocator
detachBehavior() 从组件中分离一个行为. yii\base\Component
detachBehaviors() 分离组件中的所有行为. yii\base\Component
ensureBehaviors() 确保在 behaviors() 中声明的行为已附加到此组件. yii\base\Component
get() 返回具有指定ID的组件实例. yii\di\ServiceLocator
getBehavior() 返回指定的行为对象. yii\base\Component
getBehaviors() 返回附加到此组件的所有行为. yii\base\Component
getComponents() 返回组件定义列表或已加载组件的实例. yii\di\ServiceLocator
has() 返回一个值, 指示定位器是否具有指定的组件定义或是否已实例化该组件. yii\di\ServiceLocator
hasEventHandlers() 返回一个值, 指示是否有任何处理程序附加到指定的事件. yii\base\Component
hasMethod() 返回一个值, 指示方法是否已定义. yii\base\Component
hasProperty() 返回一个值, 指示属性是否已定义. yii\base\Component
init() 初始化对象. yii\base\BaseObject
off() 从该组件分离现有的事件处理程序. yii\base\Component
on() 将事件处理程序附加到事件. yii\base\Component
set() 使用此定位器注册组件定义. yii\di\ServiceLocator
setComponents() 在此定位器中注册一组组件定义. yii\di\ServiceLocator
trigger() 触发事件. yii\base\Component

属性详情

$components public 属性

组件定义列表或已加载的组件实例(ID => 定义或实例).

public array $components null

方法详情

__get() public 方法

Getter 魔术方法.

重写此方法以支持像读取属性一样访问组件.

public mixed __get ( $name )
$name string

组件或属性名称.

return mixed

指定属性的值.

__isset() public 方法

检查属性值是否为null.

该方法通过检查指定的组件是否已加载来覆盖父实现.

public boolean __isset ( $name )
$name string

属性名称或事件名称.

return boolean

属性值是否为null.

clear() public 方法

从定位器中移除组件.

public void clear ( $id )
$id string

组件ID.

get() public 方法

返回具有指定ID的组件实例.

参见:

public object|null get ( $id, $throwException true )
$id string

组件ID (eg. db).

$throwException boolean

如果$id未在定位器中注册, 是否抛出异常.

return object|null

指定ID的组件. 如果$throwExceptionfalse$id未注册, 则返回null.

throws yii\base\InvalidConfigException

如果$id引用一个不存在的组件ID.

getComponents() public 方法

返回组件定义列表或已加载组件的实例.

public array getComponents ( $returnDefinitions true )
$returnDefinitions boolean

是否返回组件定义而不是已加载的组件实例.

return array

组件定义列表或已加载的组件实例(ID => 定义或实例).

has() public 方法

返回一个值, 指示定位器是否具有指定的组件定义或是否已实例化该组件.

此方法可能返回不同的结果, 具体取决于$checkInstance的值.

  • 如果$checkInstancefalse(默认), 则该方法将返回一个值, 指示定位器是否具有指定的组件定义.
  • 如果$checkInstancetrue, 则该方法将返回一个值, 指示定位器是否已实例化指定的组件.

参见 set().

public boolean has ( $id, $checkInstance false )
$id string

组件ID (eg. db).

$checkInstance boolean

该方法是否应检查组件是否已共享和实例化.

return boolean

定位器是否具有指定的组件定义或是否已实例化该组件.

set() public 方法

使用此定位器注册组件定义.

例如,

// 一个类名
$locator->set('cache', 'yii\caching\FileCache');

// 一个配置数组
$locator->set('db', [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=127.0.0.1;dbname=demo',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8',
]);

// 一个匿名函数
$locator->set('cache', function ($params) {
    return new \yii\caching\FileCache;
});

// 一个实例
$locator->set('cache', new \yii\caching\FileCache);

如果已存在具有相同ID的组件定义, 则将覆盖该组件定义.

public void set ( $id, $definition )
$id string

组件ID (eg. db).

$definition mixed

要使用此定位器注册的组件定义.

它可以是以下之一:

  • 一个类名
  • 一个配置数组: 该数组包含 name-value 对, 用于在调用 get() 时初始化新创建的对象的属性值. class元素是必需的, 代表要创建的对象的类.
  • 一个 PHP 匿名函数: 匿名函数或表示类方法的数组(eg. ['Foo', 'bar']). 回调将由 get() 调用, 以返回与指定组件ID关联的对象.
  • 一个对象: 当 get() 被调用时, 这个对象将被返回.
throws yii\base\InvalidConfigException

如果定义是一个无效的配置数组.

setComponents() public 方法

在此定位器中注册一组组件定义.

这是 set() 的批量版本. 该参数应该是一个数组, 其键是组件ID, 值是相应的组件定义.

有关如何指定组件的ID和定义的更多详细信息, 请参阅 set().

如果已存在具有相同ID的组件定义, 则将覆盖该组件定义.

以下是注册两个组件定义的示例:

[
    'db' => [
        'class' => 'yii\db\Connection',
        'dsn' => 'sqlite:path/to/file.db',
    ],
    'cache' => [
        'class' => 'yii\caching\DbCache',
        'db' => 'db',
    ],
]
public void setComponents ( $components )
$components array

组件定义或实例.