摘要:本文代碼什么是依賴注入對象由框架來創建而不是程序員通過創建。解除了調用者與被調用者之間的依賴。的依賴注入通過提供容器特性。靈活使用可以使我們從依賴關系中解脫出來,專注于業務邏輯。
本文代碼
https://github.com/xialeistudio/yii2-di-demo
什么是依賴注入(DI)?對象由框架來創建而不是程序員通過 new 創建。跟IoC差不多一個意思。
為什么要有依賴注入?解耦。調用方不再通過 new 運算符實例化被調用對象,而通過框架(IoC容器)創建之后注入進來。解除了調用者與被調用者之間的依賴。
有利于面向接口編程。個人認為OOP程序設計最重要的就是面向接口(面向抽象)編程。因為有了第1步的關系,調用者只需要依賴接口類型而不用依賴實現類型,提高了程序的擴展性。
Yii2的依賴注入Yii2通過 yiidiContainer 提供DI容器特性。目前支持一下4種方式注入:
構造方法注入
方法注入
Setter和屬性注入
PHP回調注入
注冊依賴關系通過容器的 set 方法注入
通過配置文件注入(推薦)
依賴注入實戰
打開終端,執行以下命令初始化項目:
composer create-project --prefer-dist yiisoft/yii2-app-basic basic
聲明接口業務類 appservicesUserService
接口實現文件 appservicesimplUserServiceImpl
1, "name" => "xialei"], ["id" => 2, "name" => "zhangsan"], ]; public function show($id) { foreach ($this->users as $user) { if ($user["id"] == $id) { return $user; } } return null; } public function all() { return $this->users; } }
注冊依賴關系 config/web.php
"basic", "basePath" => dirname(__DIR__), "bootstrap" => ["log"], "aliases" => [ "@bower" => "@vendor/bower-asset", "@npm" => "@vendor/npm-asset", ], "container" => [ "definitions" => [ UserService::class => UserServiceImpl::class ] ], "components" => [ "request" => [ // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation "cookieValidationKey" => "0xGrStOOZE2oXxNNiu-o2eYovJ_Ia1Dk", ], "response" => [ "format" => "json" ], "errorHandler" => [ "errorAction" => "site/error", ], "urlManager" => [ "enablePrettyUrl" => true, "showScriptName" => false, "rules" => [ ], ], ], ]; if (YII_ENV_DEV) { // configuration adjustments for "dev" environment $config["bootstrap"][] = "debug"; $config["modules"]["debug"] = [ "class" => "yiidebugModule", // uncomment the following to add your IP if you are not connecting from localhost. //"allowedIPs" => ["127.0.0.1", "::1"], ]; $config["bootstrap"][] = "gii"; $config["modules"]["gii"] = [ "class" => "yiigiiModule", // uncomment the following to add your IP if you are not connecting from localhost. //"allowedIPs" => ["127.0.0.1", "::1"], ]; } return $config;
添加控制器 appcontrollersUserController
userService = $userService; parent::__construct($id, $module, $config); } public function actionShow($id) { $user = $this->userService->show($id); if (empty($user)) { throw new NotFoundHttpException("用戶不存在"); } return $user; } public function actionAll() { return $this->userService->all(); } }
運行測試服務器
./yii serve/index
訪問用戶列表接口 http://localhost:8080/user/all
[{ "id": 1, "name": "xialei" }, { "id": 2, "name": "zhangsan" }]
訪問查看用戶接口 http://localhost:8080/user/show?id=1
{ "id": 1, "name": "xialei" }寫在最后如你所見,Yii2自帶的IoC容器使用起來還是挺方便的,觀測了Yii 配置優于編碼 的思想,Yii的組件基本上都可以在配置文件中進行配置而不需要手動編碼。
靈活使用DI可以使我們從依賴關系中解脫出來,專注于業務邏輯。
當然,業務邏輯的組織也是一個很大的研究課題,有興趣的可以去看看 DDD(領域驅動設計)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/28679.html
摘要:構造器注入實現特定參數的構造函數,在新建對象時傳入所依賴類型的對象。 基本概念 1.依賴倒置(反轉)原則(DIP):一種軟件架構設計的原則(抽象概念,是一種思想)在面向對象編程領域中,依賴反轉原則(Dependency inversion principle,DIP)是指一種特定的解耦(傳統的依賴關系創建在高層次上,而具體的策略設置則應用在低層次的模塊上)形式,使得高層次的模塊不依賴于...
摘要:調用方法創建類得實例化對象,實際上又調用了依賴注入容器獲取每一個類的實例化對象。依賴注入容器自動解決待實例化類的依賴關系,并返回待實例化類的實例對象。 以下是Yii2源碼中,ServiceLocator(服務定位器)與Container(依賴注入容器)的關系解析圖。 一句話總結 Application繼承了ServiceLocator,是一個服務器定位器,ServiceLocator用...
摘要:反射簡介參考官方簡介的話,具有完整的反射,添加了對類接口函數方法和擴展進行反向工程的能力。此外,反射提供了方法來取出函數類和方法中的文檔注釋。 反射簡介 參考官方簡介的話,PHP 5 具有完整的反射 API,添加了對類、接口、函數、方法和擴展進行反向工程的能力。 此外,反射 API 提供了方法來取出函數、類和方法中的文檔注釋。 YII2框架中示例 對于yii2框架,應該都知道di容器,...
摘要:前兩天發布了使用來運行應用,項目雖然可以運行起來,但是周邊的生態如緩存,,日志等等并沒有跟上,實際上開發體驗比較差。周末研究了一下,把框架集成到了應用上。 前兩天發布了使用swoole來運行thrift應用,項目雖然可以運行起來,但是周邊的生態(如緩存,ORM,日志等等)并沒有跟上,實際上開發體驗比較差。周末研究了一下,把Yii2框架集成到了thrift應用上。 項目地址:https:...
摘要:好啦,我們看看在框架的不同版本中是怎么處理攻擊,注入等問題的。那要是,又是怎樣處理的喃考慮目前國內網站大部分采集文章十分頻繁,更有甚者不注明原文出處,原作者更希望看客們查看原文,以防有任何問題不能更新所有文章,避免誤導繼續閱讀 作者:白狼 出處:http://www.manks.top/yii2_filter_xss_code_or_safe_to_database.html 本文版權...
閱讀 2849·2021-08-20 09:37
閱讀 1607·2019-08-30 12:47
閱讀 1090·2019-08-29 13:27
閱讀 1685·2019-08-28 18:02
閱讀 749·2019-08-23 18:15
閱讀 3084·2019-08-23 16:51
閱讀 931·2019-08-23 14:13
閱讀 2125·2019-08-23 13:05