没有命名空间的类 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\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/yiichina/yii2/blob/api/framework/di/ServiceLocator.php

ServiceLocator 实现 service locator

要使用 ServiceLocator, 首先需要通过调用 set()setComponents() 向定位器注册具有相应组件定义的组件 IDs。 然后你可以通过调用 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 继承,所以模型和应用程序都是服务定位器。 模块添加 tree traversal 用于服务解析。

关于 ServiceLocator 更多的细节和用法,请参阅 guide article on service locators

公共属性

隐藏继承的属性

属性类型描述被定义在
$behaviors yii\base\Behavior[] List of behaviors attached to this component yii\base\Component
$components array The 组件定义列表或加载的组件实例(ID => definition or instance)。 yii\di\ServiceLocator

公共方法

隐藏继承的方法

方法描述被定义在
__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() Getter 魔术方法。 重写此方法以支持访问诸如读取属性之类的组件。 yii\di\ServiceLocator
__isset() 检查属性值是否为 null。 此方法通过检查是否已加载命名组件来覆盖父类的实现。 yii\di\ServiceLocator
__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\ServiceLocator
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() 返回具有指定 ID 的组件实例。 yii\di\ServiceLocator
getBehavior() Returns the named behavior object. yii\base\Component
getBehaviors() Returns all behaviors attached to this component. yii\base\Component
getComponents() 返回组件定义列表或已加载的组件实例。 yii\di\ServiceLocator
has() 返回一个值,该值表示定位器是否具有指定的组件定义或是否已实例化该组件。 此方法根据 $checkInstance 的值返回不同的结果。 yii\di\ServiceLocator
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
init() Initializes the object. yii\base\BaseObject
off() Detaches an existing event handler from this component. yii\base\Component
on() Attaches an event handler to an event. yii\base\Component
set() 用定位器注册一个组件。 yii\di\ServiceLocator
setComponents() 在定位器中注册一组组件定义。 yii\di\ServiceLocator
trigger() Triggers an event. yii\base\Component

属性详情

$components 公共 属性

The 组件定义列表或加载的组件实例(ID => definition or instance)。

public array getComponents ( $returnDefinitions true )
public void setComponents ( $components )

方法详情

__get() 公共 方法

Getter 魔术方法。 重写此方法以支持访问诸如读取属性之类的组件。

public mixed __get($name)
$name string

组件或属性名称

return mixed

命名的属性值

__isset() 公共 方法

检查属性值是否为 null。 此方法通过检查是否已加载命名组件来覆盖父类的实现。

public boolean __isset($name)
$name string

属性名或事件名

return boolean

是否属性名为 null

clear() 公共 方法

从定位器移除组件。

public void clear($id)
$id string

组件 ID

get() 公共 方法

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

参见:

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

组件 ID(e.g. db)。

$throwException boolean

如果 $id 之前未在定位器中注册,是否抛出一个异常。

return object|null

指定 ID 的组件。如果 $throwException 为 false 并且 $id 在之前没有被注册,将会返回 null。

throws yii\base\InvalidConfigException

如果 $id 为不存在的组件 ID 抛出的异常。

getComponents() 公共 方法

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

public array getComponents($returnDefinitions true)
$returnDefinitions boolean

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

return array

The 组件定义列表或加载的组件实例(ID => definition or instance)。

has() 公共 方法

返回一个值,该值表示定位器是否具有指定的组件定义或是否已实例化该组件。 此方法根据 $checkInstance 的值返回不同的结果。

  • 如果 $checkInstance 为 false(default), 此方法将返回一个表示定位器是否具有指定组件定义的值。
  • 如果 $checkInstance 为 true, 此方法会返回一个表示定位器是否已经实例化指定组件的值。

参见 set().

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

组件 ID(e.g. db)。

$checkInstance boolean

是否应检查组件是否已共享和实例化。

return boolean

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

set() 公共 方法

用定位器注册一个组件。

例如,

// 类名
$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(e.g. db)。

$definition mixed

使用定位器注册的组件。 它可以是以下之一:

  • 类名
  • 配置数组:数组包含键值对,当调用 get() 时, 将用于初始化新创建的对象的属性值。 class 是必须的,代表要创建的对象的类。
  • PHP 回调:匿名函数或表示类方法的数组(e.g. ['Foo', 'bar'])。 回调将会由 get() 调用,以返回与指定组件ID关联的对象。
  • 对象:当调用 get() 时,将会返回对象。
throws yii\base\InvalidConfigException

如果定义是无效的配置数组抛出的异常

setComponents() 公共 方法

在定位器中注册一组组件定义。

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

有关如何指定组件 IDs 和定义的更多详细信息,请参阅 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

组件定义或实例