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