18. Yii 2.0 依赖注入容器

本文介绍了依赖注入的概念及其在Yii2框架中的应用。通过具体示例展示了如何在项目中实施依赖注入,包括创建配置文件、定义依赖关系及在控制器中使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

三层架构:从高到底分别是 用户界面层(UIL)、业务逻辑层(BLL)和 数据访问层(DAL),传统的依赖关系是高层模块直接依赖于低层模块。
区分层次的目的是为了”高内聚、低耦合“的思想。

依赖倒置:高层模块不依赖于低层模块的实现,而是依赖于二者之间的抽象(接口)。

控制反转(Inversion of Control,简称 IoC)
控制反转是一种设计模式,它是工厂模式的升华,可以把 IoC 看作是一个大工厂,只不过这个大工厂里要生成的对象是通过一个配置文件(java中用XML文件,php中用php文件)来定义的,然后利用反射技术,即根据给出的字符串类名来生成相应的对象。IoC 把以前在工厂方法里写死的对象,变为由配置文件来定义,从而把对象和工厂分离开来,提高了工厂模式的灵活性。
控制反转一般分为两种类型,依赖注入和依赖查找。

依赖注入(Dependency Injection,简称 DI
依赖注入是控制反转的一种类型,通过依赖注入,高层模块不再依赖于底层模块,而是依赖于层次外部的程序,从而实现层次间的解耦。

比如:业务逻辑层和数据访问层,按照传统的依赖关系,我们经常会在业务逻辑层直接实例化一个数据库连接对象(如:MySQL),来访问数据库,这种依赖关系的耦合性太高,不便于解耦。假如,我们现在要从MySQL切换到Oracle,就需要修改大量的业务逻辑层的代码。
依赖注入可以解决这个问题,它将需要用到的类放到一个统一的配置文件中,通过一个容器在需要的时候把这个依赖关系形成,即把需要的接口实现注入到需要它的类中。

Yii 2.0 框架的依赖注入核心文件所在的目录为  vendor/yiisoft/yii2/di,核心类文件是 Container.php(容器)即工厂,需要用到某个对象的时候,工厂才会将容器中的类实例化为对象。

这里以 Yii 2.0 基础版为例,介绍如何使用依赖注入。

首先,在项目的组件目录中  /basic/components 创建一个类(比如mysql数据库连接类)Mysql.php,代码如下:
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
           
<?php
namespace app\components ;
class Mysql {
public $username ;
public $port ;
public function __construct () {
echo 'mysql对象创建成功!' . '<br>' ;
}
}
 来自CODE的代码片
snippet_file_0.php
其次,在项目配置目录  /basic/config 中添加一个 container.php 文件,作为依赖关系的配置文件,代码如下:
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
           
<?php
// 注册依赖关系(将类注入到容器)
// \Yii::$container->set('app\components\Mysql');
// 使用单例模式,注册依赖关系
// \Yii::$container->setSingleton('app\components\Mysql');
// 注册依赖关系的同时,给类取一个别名,这种方式就可以很方便地从Mysql切换到Oracle
// \Yii::$container->set('db', 'app\components\Mysql');
// \Yii::$container->setSingleton('db', 'app\components\Mysql');
// 注册依赖关系的同时,给类取别名,并指定类的属性的值(这种方式最常用)
\Yii :: $container -> set ( 'db' , [
'class' => 'app\components\Mysql' ,
'username' => 'root' ,
]);
 来自CODE的代码片
snippet_file_0.php
然后,在项目入口文件  /basic/web/index.php 中引入该配置文件,添加下面的一行代码即可:
require __DIR__ . '/../config/container.php';

最后,在控制器层  /basic/controllers,新增一个控制器文件  DiController.php,用于测试,代码如下:
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
           
<?php
namespace app\controllers ;
use yii\web\Controller ;
class DiController extends Controller {
public function actionIndex (){
// var_dump(\Yii::$container->get('app\components\Mysql')); // 实例化对象
// echo '<hr>';
// var_dump(\Yii::$container->get('app\components\Mysql'));
var_dump ( \Yii :: $container -> get ( 'db' )); // 实例化对象
}
}
 来自CODE的代码片
snippet_file_0.php
在浏览器中,访问  http://basic.com/di/index 进行测试。

其实,Yii 中的注册组件就是依赖注入。当我们要将一个封装好的操作类依赖注入时,既可以使用上面的方式,也可以使用注册组件的方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值