您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
5-3 YII依赖注入之服务定位器
发布时间:2023-04-29 22:33:30编辑:雪饮阅读()
-
依赖注入呢,基本上到这里就差不多结束了。
上篇中我们实现了用容器完成依赖注入的方案。
但如果说我们想要将一个入口类直接做为一个服务,类似就是说”\YII::$app->$服务名”这样的调用方式呢?
那么本篇就是来看看服务定位器的使用以及将入口类做为服务名配置起来并通过”\YII::$app->$服务名”这样的方式来调用。
那么具体实现就是在两个地方,一个是配置的地方,一个是调用的地方。
配置地方如:
D:\phpstudy_pro\WWW\www.xyyii.com\basic\config\web.php的局部配置如:
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'db' => require(__DIR__ . '/db.php'),
//组件名以及该组件对应的入口类的名称空间的定义
'car5'=>[
'class'=>'app\controllers\Car5'
]
],
'params' => $params,
];
然后控制器中的实现如:
<?php
namespace app\controllers;
use yii\web\Controller;
use yii\di\ServiceLocator;
//step5
interface Cup{
public function drink();
}
interface Driver5{
public function drive();
}
Class RedCup implements Cup{
public function drink(){
echo 'I am drinking water from a red cup.';
}
}
class ManDriver5 implements Driver5 {
public function __construct(Cup $cup)
{
$cup->drink();
echo "<hr/>";
}
public function drive(){
echo 'After drinking water, I will drive.';
}
}
class Car5{
private $driver=null;
public function __construct(Driver5 $driver)
{
$this->driver=$driver;
}
public function run(){
$this->driver->drive();
}
}
class HelloController extends Controller{
public function actionIndex5(){
/*依赖注入step5:服务定位器
* 基于上篇依赖注入step4的实现
* 服务定位器主要其实是为了下一步就是做成配置(这里的配置是指服务配置,即如\YII::$app->car5->run();是直接在$app级别直接执行的)而准备的
* 向step4一样,如果我们的依赖注入方案中有用到多个接口,则同样可以用set
* 这里如\YII::$container->set来多次set即可
* 那么我们先来看看暂时先不做为配置,而是写在控制器中的实现如下
*
* */
\YII::$container->set('app\controllers\Driver5','app\controllers\ManDriver5');
\YII::$container->set('app\controllers\Cup','app\controllers\RedCup');
$sl=new ServiceLocator;
//这里第一个参数是定义服务定位器标记,以及该服务(入口类)的名称空间路径
$sl->set('car5',['class'=>'app\controllers\Car5']);
//然后ServiceLocator的get参数接收一个服务定位器标记来获得该服务(入口类)
$car=$sl->get('car5');
$car->run();
}
public function actionIndex6(){
/*
* 依赖注入服务定位:调用
* 这里是调用如D:\phpstudy_pro\WWW\www.xyyii.com\basic\config\web.php中config里面components里面的所谓的服务
* 那么其实我理解为组件
* */
\YII::$container->set('app\controllers\Driver5','app\controllers\ManDriver5');
\YII::$container->set('app\controllers\Cup','app\controllers\RedCup');
//这里调用的组件名car5对应于如D:\phpstudy_pro\WWW\www.xyyii.com\basic\config\web.php中config里面components里面的定义的组件名
\YII::$app->car5->run();
}
}
关键字词:依赖注入,服务定位器
上一篇:5-2 YII依赖注入之容器