作為開發人員,我們一直在嘗試找到新的方法來編寫設計和清潔代碼,並使用新樣式,使用設計模式以及嘗試新的健壯框架。在本文中,我們將通過Laravel的IOC組件探索依賴性注入設計模式,並查看如何改善我們的設計。
鑰匙要點依賴注入是敏捷體系結構的關鍵要素。
讓我們看看一個示例:
如果要測試或維護此類,則必須訪問真實數據庫並進行一些查詢。為了避免必須這樣做,並從剩下的類中
decouple<span>class UserProvider{ </span> <span>protected $connection; </span> <span>public function __construct(){ </span> <span>$this->connection = new Connection; </span> <span>} </span> <span>public function retrieveByCredentials( array $credentials ){ </span> <span>$user = $this->connection </span> <span>->where( 'email', $credentials['email']) </span> <span>->where( 'password', $credentials['password']) </span> <span>->first(); </span> <span>return $user; </span> <span>} </span><span>}</span>
將組件注入班級時,您可以使用以下三個選項之一:> 構造器注入
設置器注入
<span>class UserProvider{ </span> <span>protected $connection; </span> <span>public function __construct( Connection $con ){ </span> <span>$this->connection = $con; </span> <span>} </span> <span>...</span>
當類實現我們的界面時,我們定義了要解決依賴項的注入連接方法。
<span>class UserProvider{ </span> <span>protected $connection; </span> <span>public function __construct(){ </span> <span>... </span> <span>} </span> <span>public function setConnection( Connection $con ){ </span> <span>$this->connection = $con; </span> <span>} </span> <span>...</span>
如果您想進一步了解DI,Alejandro Gervassio在本系列中廣泛而專業地介紹了它,請務必閱讀這些文章。現在,IOC呢? IOC(控制倒置)不需要使用依賴注入,但是它可以幫助您有效地管理依賴項。
>
倒置控制當您要求一個對象時,Laravel IOC以某種方式與解決依賴關係的方式很特別:
>我們將使用一個簡單的示例,我們將在本文中進行改進。
SimpleAuth類具有Filesessessorage的依賴性,因此我們的代碼可能看起來像:
這是這樣做的經典方式,讓我們從使用構造函數注入開始。
現在我們創建我們的對象:
<span>class UserProvider{ </span> <span>protected $connection; </span> <span>public function __construct(){ </span> <span>$this->connection = new Connection; </span> <span>} </span> <span>public function retrieveByCredentials( array $credentials ){ </span> <span>$user = $this->connection </span> <span>->where( 'email', $credentials['email']) </span> <span>->where( 'password', $credentials['password']) </span> <span>->first(); </span> <span>return $user; </span> <span>} </span><span>}</span>
由於應用程序類擴展了容器類,因此您可以始終通過應用程序外觀訪問容器。
<span>class UserProvider{ </span> <span>protected $connection; </span> <span>public function __construct( Connection $con ){ </span> <span>$this->connection = $con; </span> <span>} </span> <span>...</span>
bind方法的第一個參數是一個唯一的ID來綁定到容器中,第二個是每次解決文件essionStorage類時要執行的回調函數,我們還可以傳遞代表類名稱的字符串,如我們所見下一個。
<span>class UserProvider{ </span> <span>protected $connection; </span> <span>public function __construct(){ </span> <span>... </span> <span>} </span> <span>public function setConnection( Connection $con ){ </span> <span>$this->connection = $con; </span> <span>} </span> <span>...</span>
假設我們要將會話存儲切換到MySQL,我們的課程應與:
相似:>現在我們已經改變了依賴關係,我們需要更改簡單構造函數並將新對象綁定到容器!
<span>interface ConnectionInjector{ </span> <span>public function injectConnection( Connection $con ); </span><span>} </span> <span>class UserProvider implements ConnectionInjector{ </span> <span>protected $connection; </span> <span>public function __construct(){ </span> <span>... </span> <span>} </span> <span>public function injectConnection( Connection $con ){ </span> <span>$this->connection = $con; </span> <span>} </span><span>}</span>
應該取決於抽象。
抽像不應取決於細節。詳細信息應取決於在抽像上。
Robert C. Martin
<span>class FileSessionStorage{ </span> <span>public function __construct(){ </span> <span>session_start(); </span> <span>} </span> <span>public function get( $key ){ </span> <span>return $_SESSION[$key]; </span> <span>} </span> <span>public function set( $key, $value ){ </span> <span>$_SESSION[$key] = $value; </span> <span>} </span><span>} </span> <span>class SimpleAuth{ </span> <span>protected $session; </span> <span>public function __construct(){ </span> <span>$this->session = new FileSessionStorage; </span> <span>} </span><span>} </span> <span>//creating a SimpleAuth </span><span>$auth = new SimpleAuth();</span>
>
因此,我們可以抽像我們的存儲實現:
這樣,我們就可以實現並要求sessionStorage接口的實例:> <span>class UserProvider{ </span> <span>protected $connection; </span> <span>public function __construct(){ </span> <span>$this->connection = new Connection; </span> <span>} </span> <span>public function retrieveByCredentials( array $credentials ){ </span> <span>$user = $this->connection </span> <span>->where( 'email', $credentials['email']) </span> <span>->where( 'password', $credentials['password']) </span> <span>->first(); </span> <span>return $user; </span> <span>} </span><span>}</span>登入後複製登入後複製登入後複製>如果我們嘗試使用App :: Make('SimpleAuth')通過容器解決簡單的類,則容器將在嘗試從綁定中解析類,然後倒退到反射方法並解決後,將拋出bindingResolutionException所有依賴項。
<span>class UserProvider{ </span> <span>protected $connection; </span> <span>public function __construct( Connection $con ){ </span> <span>$this->connection = $con; </span> <span>} </span> <span>...</span>登入後複製登入後複製登入後複製容器正在嘗試實例化接口。我們可以通過為我們的界面創建特定的綁定來解決這一點。
><span>class UserProvider{ </span> <span>protected $connection; </span> <span>public function __construct(){ </span> <span>... </span> <span>} </span> <span>public function setConnection( Connection $con ){ </span> <span>$this->connection = $con; </span> <span>} </span> <span>...</span>登入後複製登入後複製登入後複製現在,每次我們嘗試通過容器解決接口時,我們都會獲得一個mySQLSessionStorage實例。如果我們要切換我們的存儲服務,我們可以更新綁定。
>>注意:如果要查看類是綁定到容器的類別,您可以使用app :: bond('className')或使用app :: bindif('className')在綁定(如果hasn'hasn'的情況下)註冊t已經註冊了。
Laravel IOC還提供APP :: Singleton('className','Resolver')用於共享綁定。 您還可以使用app :: instance('className','instance')創建共享實例。
最終提示
如果容器無法解決依賴關係,它將拋出反射exception,但是我們可以使用app :: resolvingany(closure)解決任何給定類型或作為後備的形式。>
>注意:如果您為給定類型註冊解析器,也將調用解決方案方法,但是返回了綁定方法的值。>>>>>>
在哪裡存儲綁定:
如果您只有一個小應用程序,則可以使用global/start.php,但是如果您的項目越來越大,則必須使用服務提供商。測試:
經常詢問有關Laravel IOC- 剛剛進行測試時,您需要考慮使用PHP Artisan Tinker,它非常強大,並且可以增加Laravel測試工作流程。
反射API:
- PHP反射API非常強大,如果您想了解laravel ioc,您需要熟悉反射API,請務必檢查本教程以獲取更多信息。
結論>
>一如既往,了解某些內容的最佳方法是檢查源代碼。 Laravel IOC只是一個文件,不應該花您很長時間來完成所有功能。您想進一步了解Laravel IOC或IOC嗎?讓我們知道!中依賴注入的問題
>在Laravel的IOC中依賴注入的主要目的是什麼?這意味著,您沒有讓您的對象創建依賴關係或要求工廠對象為其製作一個對象,而是將所需的依賴項傳遞到外部對象。這使您的代碼更加靈活,可重複使用且更易於測試,因為您可以從類外部控制依賴項。> Laravel的IOC容器如何工作?它控制瞭如何解決和創建不同對象。當類具有依賴性時,容器會在實例化時自動注入它們。這是通過稱為“自動線”的過程完成的,容器會在其中檢查類以自動確定依賴項。將服務綁定到Laravel的IOC容器,您可以使用綁定方法。此方法接受兩個參數:解決服務時將使用的類或接口名稱,以及返回類實例的閉合。閉合將接收容器實例,允許您解決實例化類所需的任何其他依賴。 Laravel的IOC容器中的Singleton在於如何管理實例。當您綁定服務時,每次您解決該服務時都會創建服務的新實例。另一方面,當您使用Singleton時,每次解決服務時都會返回相同的實例。
>>我如何從Laravel的IOC容器中解析服務?從Laravel的IOC容器中,您可以使用Make方法。此方法接受服務的名稱以解決其參數。如果該服務已綁定到容器,它將返回服務的實例,其所有依賴項會自動注入。
>>依賴量注射如何改善Laravel的測試?通過使您的代碼更加靈活和脫鉤來測試Laravel。這意味著您可以在測試過程中輕鬆地將依賴關係與模擬對象交換。這使得隔離測試的代碼並控制測試環境變得更加容易。
我可以在Laravel的IOC容器中使用接口綁定嗎? 。這使您可以將接口綁定到給定的實現。然後,每當請求接口時,容器都會注入限制的實現。
>> laravel的IOC容器如何處理自動分辨率?
laravel的IOC容器的IOC容器可以通過使用反射來檢查依賴項來處理自動分辨率一堂課。當您嘗試解決一堂課時,容器將自動構建和注入類所需的所有依賴項。>
> Laravel的IOC容器中的服務提供商是什麼?容器是一種在單個位置分組相關的IOC註冊的方法。它們是配置您的應用程序的中心地點。每個Laravel應用程序都包含許多服務提供商的核心服務。>如何在Laravel的IOC容器中註冊服務提供商?
>在Laravel的IOC容器中註冊服務提供商,您可以將其添加到config/app.php配置文件中的提供商數組中。一旦註冊了服務提供商,該應用程序被引導時將由Laravel引導。
以上是Laravel的依賴注入的詳細內容。更多資訊請關注PHP中文網其他相關文章!