1. 程式人生 > >18. Yii 2.0 依賴注入容器

18. Yii 2.0 依賴注入容器

三層架構:從高到底分別是使用者介面層(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
<?phpnamespace app\components;class Mysql { public $username; public $port; public function
__construct() { echo 'mysql物件建立成功!'.'<br>'; }}
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', ]);
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
<?phpnamespace 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')); // 例項化物件 }}
snippet_file_0.php 在瀏覽器中,訪問 http://basic.com/di/index 進行測試。 其實,Yii 中的註冊元件就是依賴注入。當我們要將一個封裝好的操作類依賴注入時,既可以使用上面的方式,也可以使用註冊元件的方式。