文档章节

Yii2 Day 9: 依赖注入实践

_Elvis
 _Elvis
发布于 2015/03/02 09:09
字数 630
阅读 1010
收藏 3

目标

Yii1.x经常被批评为强耦合,很难使用第三方库。通常持这样的观点的人会提及Yii1对DI的支持不够,或者说几乎没有。其实个人认为还是有一些朴素的支持的,比如application就是一个DI,各种组件都是通过 Yii::app()->xxx 的方式创建并引用的,怎么能说没有DI呢?至少实现了一些基本要素:

  1. 依赖的创建交给了application,而不需要程序员手动在代码中 new来
  2. 维护了一个依赖列表,同一个依赖,在多次被使用的时候,只需要创建一次

作为富有进取心的框架,Yii2肯定不能再继续受这样的批评啦,于是在DI上做了很多工作,达到了DI的几个基本要求

  1. 创建过程自动化,也就是Ioc,控制反转,即不需要程序员手动new
  2. 依赖的依赖管理,即当依赖又依赖于其他依赖时,能够自动创建其他依赖

关于Yii2的依赖注入实现与原理,有网友已经给出了详细的分析,推荐大家看看。地址:http://www.digpage.com/di.html,写得相当好啦,很赞。

实际例子

既然依赖注入据说有利于降低各个模块之间的耦合度,那么就让我们试试效果。架设我们的Store模块需要一个AdminContext的依赖,那么我们可以在模块的init方法中将依赖加进去:

<!-- lang: php -->
//文件 StoreModule.php
 public function init()
{
    parent::init();

    //开始添加依赖
    $this->set('ac',[
       'class'=>'mtBridge\services\AdminContext',
    ]);
}

上面的代码,因为Module本身是继承自ServiceLocator,所以可以直接使用set方法添加一个依赖项。再看看AdminContext类的定义:

<!-- lang: php -->
class AdminContext implements IAdminContext
{
    public $env;
    public $cs;

    public function __construct(EnvContext $e,CacheService $c)
    {
        $this->env = $e;
        $this->cs = $c;
    }
    public function doCallTest()
    {
        $siteName  = $this->env->getSiteName();
        $s = $this->cs->getCacheKey(1,'site');
        return array($siteName,$s);
    }
}

发现AdminContext的构造函数需要EnvContext和CacheService两个类型的对象作为参数,正好测试Yii2的DI的依赖的子依赖的支持。加个测试页面吧。

<!-- lang: php -->
class TestController extends \yii\web\Controller
{
    public function actionIndex()
    {
        list($siteName,$key) = $this->module->get('ac')->doCallTest();
        list($siteName2,$key2) = $this->module->get('ac')->doCallTest();
        echo $siteName . '--key--' . $key;
    }
}

运行这个action的代码,正常输出,并且两次调用,ac也就实例化一次。

© 著作权归作者所有

_Elvis
粉丝 77
博文 41
码字总数 29082
作品 0
海淀
程序员
私信 提问
yii2源码分析之组件实例化流程

读本篇文章,建议先看看我之前的文章php依赖注入 到此,现在我们正式开始分析yii2框架组件构造流程 我们先从yiidiServiceLocator(服务定位器)入手吧!!让我们先看个实例: use yiidiServiceLoc...

china_lx1
2018/06/27
0
0
Yii2中关于组件的注册以及创建的方法详解

了解yii组件注册与创建的过程,并发现原来yii组件注册之后并不是马上就去创建的,而是待到实际需要使用某个组件的时候再去创建对应的组件实例的。本文大概记录一下这个探索的过程。   要了...

botkenni
2018/06/08
108
0
小紫羽/yii2-fast-api

yii2-fast-api yii2-fast-api是一个Yii2框架的扩展,用于配置完善Yii2,以实现api的快速开发。 此扩展默认的场景是APP的后端接口开发,因此偏向于实用主义,并未完全采用restfull的标准,方便...

小紫羽
2017/01/20
0
0
Yii2 实例管理

Yii2 实例管理 Yii2框架没有提供类似ZendFramework3中提供的ServiceManager.那么Yii2框架是如何管理对象实例的呢? 长时间使用Yii2框架的童鞋一定已经适应了对象中的public变量,以及一个来自y...

Vett
2017/12/23
0
0
Yii2 Day 3: 让PHPStorm支持自定义Component依赖注入代码提示

场景是这样的: 定义了一个 MyComponent,在配置文件中加上这个组件的定义,比如: 'myComponent'=>['class'=>'app/components/MyComponent'], 就可以用Yii::$app->myComponent调用啦,但是,......

_Elvis
2014/12/02
3.9K
3

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
今天
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
9
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
12
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
11
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部