** Yii——组件注册 **:Yii的组件相当于Laravel的服务,同样需要注册到一个IOC容器中,以便在应用其他地方使用这些组件/服务

这相当与在laravel中,使用$app应用的register或者singleton方法注册服务,而在Yii中则称为服务定位器Service Locator。

注册组件

在Yii中,要注册组件(laravel中称之为服务)可以使用如下方式:

方法一:set方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
use yii\di\ServiceLocator;
use yii\caching\FileCache;
$locator = new ServiceLocator;
$locator->set('cache', 'yii\caching\ApcCache');//使用类名直接创建
$locator->set('db', [//通过配置数组来注册
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=demo',
'username' => 'root',
'password' => '',
]);
$locator->set('search', function(){//通过一个匿名函数返回实例来注册
return new app\components\SolrService;
});
$locator->set('pageCache', new FileCache);//直接使用new实例化来注册

方法二:在配置文件中配置

返回配置数组的方式,即在应用的配置文件中配置components项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
return [
'components' => [
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=demo',
'username' => 'root',
'password' => '',
],
'cache' => 'yii\caching\ApcCache',
'search' => function() {
return new app\components\SolrService;
},
],
];

请谨慎注册太多应用组件,应用组件就像全局变量,使用太多可能加大测试和维护的难度。 一般情况下可以在需要时再创建本地组件。


使用/访问 组件

通过访问上面注册时的名字/ID 来访问,两种方式,get(‘name/id’)和属性
$cache = $locator->get(‘cache’);
$cache = $locator->cache;//通过属性


检查是否注册某个组件

$locator->has(‘name’);