摘要:現在我們就可以在構造函數或者任何其他通過服務容器注入依賴項的地方使用類型提示注入接口創建一個新的類實例,此處將注入的實例。自動解析構造函數所需的依賴的服務容器實現了接口。
簡單的服務容器
一個簡單的 php 5.3 依賴注入容器。
項目地址:https://github.com/godruoyi/easy-container
Why目前比較流行的 PHP 容器:
Pimple
Laravel Container
其他依賴注入容器
Pimple 是一個簡單優秀的 php 5.3 容器,也是目前用得最多的服務容器,在 packagist 的安裝量也達到 1000 w+。但是 Pimple 只是一個簡單的服務容器,不支持很多特性如:
class Cache { public function __construct(Config $config){} } class Config { } // 不支持 $cache = $container->make("Cache");
Pimple 不支持自動注入依賴參數,當你需要的對象依賴其他對象時,你只能依次實例化所需參數。
Laravel Container 是目前功能最全的服務容器了,支持的功能也比較全面,包括自動注入、賴加載、別名、TAG等。但是官方不推薦在非 laravel 項目中使用該組件。
如果你有留意該組件下的 composer.json 文件,你會發現他依賴 illuminate/contracts 組件。(參見)
基于此,誕生了 easy-container,該項目代碼大部分依賴于 Laravel Container 。你可以像使用 Laravel Container 容器般來使用它。
安裝composer require godruoyi/easy-container使用
你可以前往 Laravel-china 獲取更多關于 容器使用 的幫助。
初始化容器
$app = new GodruoyiContainerContainer;
簡單綁定以下文檔支持來自 laravel-china,轉載請注明出處。
可以通過 bind 方法注冊綁定,傳遞我們想要注冊的類或接口名稱再返回類的實例的 Closure :
$app->bind("HelpSpotAPI", function ($app) { return new HelpSpotAPI($app->make("HttpClient")); });
綁定一個單例注意,所有匿名函數都接受服務容器實例作為參數。
singleton 方法將類或接口綁定到只能解析一次的容器中。綁定的單例被解析后,相同的對象實例會在隨后的調用中返回到容器中:
$app->singleton("HelpSpotAPI", function ($app) { return new HelpSpotAPI($app->make("HttpClient")); });
綁定實例每次調用 $app["HelpSpotAPI"] 都將返回統一對象。
你也可以使用 instance 方法將現有對象實例綁定到容器中。給定的實例會始終在隨后的調用中返回到容器中:
$api = new HelpSpotAPI(new HttpClient); $app->instance("HelpSpotAPI", $api);綁定接口到實現
服務容器有一個強大的功能,就是將接口綁定到給定實現。例如,如果我們有一個 EventPusher 接口和一個 RedisEventPusher 實現。編寫完接口的 RedisEventPusher 實現后,我們就可以在服務容器中注冊它,像這樣:
$app->bind( "AppContractsEventPusher", "AppServicesRedisEventPusher" );
這么做相當于告訴容器:當一個類需要實現 EventPusher 時,應該注入 RedisEventPusher。現在我們就可以在構造函數或者任何其他通過服務容器注入依賴項的地方使用類型提示注入 EventPusher 接口:
use AppContractsEventPusher; /** * 創建一個新的類實例,此處將注入 AppServicesRedisEventPusher 的實例。 * * @param EventPusher $pusher * @return void */ public function __construct(EventPusher $pusher) { $this->pusher = $pusher; }解析 make 方法
你可以使用 make 方法將容器中的類實例解析出來 (無論該對象需要什么類型的參數)。make 方法接受要解析的類或接口的名稱:
$api = $app->make("HelpSpotAPI");
mark 方法是我認為最重要的方法,你可以簡單地使用「類型提示」的方式在由容器解析的類的構造函數中添加依賴項,容器將自動解析你所需要的一切參數。
// 自動解析UserController構造函數所需的依賴 $userController = $app->make(UserController::class); class UserController { public function __construct(UserRepository $users, HttpClient $client, $other = "default") { } }PSR-11
Laravel 的服務容器實現了 PSR-11 接口。因此,你可以對 PSR-11容器接口類型提示來獲取 Laravel 容器的實例:
use PsrContainerContainerInterface; $service = $app->get("Service");LISTEN
MIT
Thankslaravel-china
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/30638.html
摘要:控制反轉容器控制反轉使依賴注入變得更加便捷。有瑕疵控制反轉容器是實現的控制翻轉容器的一種替代方案。容器的獨立使用即使沒有使用框架,我們仍然可以在項目中使用安裝組件來使用的控制反轉容器。在沒有給定任何信息的情況下,容器是無法實例化相關依賴的。 聲明:本文并非博主原創,而是來自對《Laravel 4 From Apprentice to Artisan》閱讀的翻譯和理解,當然也不是原汁原味...
摘要:在構造函數中注入依賴性在中作為服務的控制器這是痛苦的,當你有個以上的依賴項,你的構造函數是行樣板代碼在屬性中注入依賴性這是我們建議的解決方案。 PHP-DI是用PHP編寫的、強大的和實用的、框架無關的依賴注入容器。這是一個關于如何使用PHP-DI和依賴注入的最佳實踐指南。 文章來源于PHP-DI,作者:Matthieu Napoli和貢獻者。PHP-DI是用PHP編寫的、強大的和實用的...
摘要:判斷是否存在構造函數,不存在直接實例化,存在則通過來獲取輸入函數,并有相應的方法解決依賴參數問題,實現依賴注入。 Laravel 框架關鍵技術解析·讀書筆記(一) 第一章 入口文件 請求訪問的入口文件,主要完成幾部分工作,分別是: 自動加載函數的添加 服務器實例化與服務注冊 路由加載 請求實例化與路由分發 相應生成與發送 其中,自動加載函數用于包含引用文件,改文件是composer...
摘要:依賴注入依賴注入一詞是由提出的術語,它是將組件注入到應用程序中的一種行為。就像說的依賴注入是敏捷架構中關鍵元素。類依賴于,所以我們的代碼可能是這樣的創建一個這是一種經典的方法,讓我們從使用構造函數注入開始。 showImg(https://segmentfault.com/img/remote/1460000018806800); 文章轉自:https://learnku.com/la...
摘要:甲乙交易活動不需要雙方見面,避免了雙方的互不信任造成交易失敗的問題。這就是的核心思想。統一配置,便于修改。帶參數的構造函數創建對象首先,就要提供帶參數的構造函數接下來,關鍵是怎么配置文件了。 前言 前面已經學習了Struts2和Hibernate框架了。接下來學習的是Spring框架...本博文主要是引入Spring框架... Spring介紹 Spring誕生: 創建Spring的...
閱讀 2024·2019-08-30 15:52
閱讀 2984·2019-08-29 16:09
閱讀 1329·2019-08-28 18:30
閱讀 2459·2019-08-26 12:24
閱讀 1102·2019-08-26 12:12
閱讀 2278·2019-08-26 10:45
閱讀 575·2019-08-23 17:52
閱讀 833·2019-08-23 16:03