Yii 是我们后端选用的一个 PHP 开发框架;框架的一个重要的好处就是帮你做了很多事情,让你少写很多代码,并且看起来清晰,可以让你更聚焦在你的业务上。
要用好框架,需要你了解很多概念。依赖注入(Denpdency Injection)和服务定位器(Service Locator)就是两个重要的基本概念。《Digpage 深入理解 Yii 2.0》依赖注入和依赖注入容器 和 服务定位器 说得非常清楚。
本文就这两个概念和 Yii 2.0 实现简要描述一下。
DIP -> IoC -> DI & SL
- SOLID;
- @ Inversion Of Control vs Dependency Injection;
- Martin Fowler: Inversion of Control Containers and the Dependency Injection pattern; 经典文章,值得读;
- Service Locator, Dependency Injection (and Container) and Inversion of Control;
- DIP:依赖倒置原则(Dependence Inversion Principle)
- IoC:控制反转(Inversion of Control)
IoC 是 DIP 的一种具体思路,DIP 只是一种理念、思想,而 IoC 是一种实现 DIP 的方法。
IoC 的核心是将类(上层)所依赖的单元(下层)的 实例化过程 交由第三方来实现。
一个简单的特征,就是类中不对所依赖的单元有诸如 $component = new yii\component\SomeClass() 的实例化语句。 - DI pattern:依赖注入(Denpdency Injection)
DI 是 IoC 的一种设计模式,是一种套路,按照 DI 的套路,就可以实现 IoC,就能符合 DIP 原则。 DI 的核心是把类所依赖的单元的实例化过程,放到类的外面去实现。
相对于 IoC,DI 是一个更具象的概念; - 在实际行文中,IoC Container 和 DI Container 通常指的都是一回事;
通过配置实现依赖关系的映射
Yii db component
Database connection is often used as an application component and configured in the application configuration like the following(config/main.php):
'components' => [
'db' => [
'class' => '\yii\db\Connection',
'dsn' => 'mysql:host=127.0.0.1;dbname=demo',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
],
],
- 'db' 是默认的 database connection;
- 假如有多个 database connections,在使用非默认链接时可以 override getDb() 函数;
Yii 2.0
- Yii 中是把 Service Locator 和 DI Container 结合起来用的,Service Locator 是建立在 DI 容器之上的。
- Service Locator
类名、别名、接口名; - 通过 config/main.php 文件来配置 Service Locator 映射关系;
- 注入:构造函数注入和属性注入;
- Yii 2.0 大多是属性注入;
- 注册(register | set)和 解析(resolve | get)
- DI 容器解析依赖获取实例的过程是自动完成的;
层层依赖(依赖嵌套)自动递归完成; - 入口脚本 index.php require Yii.php:Yii::$container = new yii\di\Container;
- 入口脚本 index.php 的 $application 是一个 Service Locator;
yii\web\Application => yii\base\Application => yii\base\Module => yii\di\ServiceLocator
- 你常使用的 Yii::$app,就是入口脚本 index.php 的 $application;
yii\base\Application::__construct() 中实现 Yii::$app = $this;