Laravel的依賴注入
作為開發人員,我們一直在嘗試找到新的方法來編寫設計和清潔代碼,並使用新樣式,使用設計模式以及嘗試新的健壯框架。在本文中,我們將通過Laravel的IOC組件探索依賴性注入設計模式,並查看如何改善我們的設計。
鑰匙要點- 依賴注入(DI)是一種設計模式,可以使硬編碼依賴關係解耦,從而使代碼更加靈活,可重複使用且易於測試。在Laravel的IOC(控制倒置)中,這是通過將所需的依賴項傳遞到外部對象而不是使對象創建依賴關係或要求工廠對象為其製作一個的對象來實現的。
- > Laravel的IOC容器是管理類依賴性的強大工具。它控制瞭如何解決和創建不同對象。當一類具有依賴性時,容器會在類稱為“自動接線”的過程實例化時自動注入它們。 >
- >使用綁定方法可以將服務綁定到Laravel的IOC容器。此方法接受兩個參數:解決服務時將使用的類或接口名稱,以及返回類實例的閉合。關閉將接收容器實例,使您可以解決實例化類所需的任何其他依賴項。 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>
將組件注入班級時,您可以使用以下三個選項之一:> 構造器注入
設置器注入
同樣,我們可以使用Setter方法注入我們的依賴性:
<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(控制倒置)不需要使用依賴注入,但是它可以幫助您有效地管理依賴項。
>
倒置控制IOC是一個簡單的組件,可以使解決依賴性更加方便。您將您的對象描述到容器中,每次解決一類時,依賴項會自動注入。
laravel 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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

在PHP中,應使用password_hash和password_verify函數實現安全的密碼哈希處理,不應使用MD5或SHA1。1)password_hash生成包含鹽值的哈希,增強安全性。 2)password_verify驗證密碼,通過比較哈希值確保安全。 3)MD5和SHA1易受攻擊且缺乏鹽值,不適合現代密碼安全。

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

PHP在現代化進程中仍然重要,因為它支持大量網站和應用,並通過框架適應開發需求。 1.PHP7提升了性能並引入了新功能。 2.現代框架如Laravel、Symfony和CodeIgniter簡化開發,提高代碼質量。 3.性能優化和最佳實踐進一步提升應用效率。

PHP的核心優勢包括易於學習、強大的web開發支持、豐富的庫和框架、高性能和可擴展性、跨平台兼容性以及成本效益高。 1)易於學習和使用,適合初學者;2)與web服務器集成好,支持多種數據庫;3)擁有如Laravel等強大框架;4)通過優化可實現高性能;5)支持多種操作系統;6)開源,降低開發成本。

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip
