搜尋
首頁後端開發php教程Laravel的依賴注入
Laravel的依賴注入Feb 21, 2025 am 10:28 AM

Laravel的依賴注入

作為開發人員,我們一直在嘗試找到新的方法來編寫設計和清潔代碼,並使用新樣式,使用設計模式以及嘗試新的健壯框架。在本文中,我們將通過Laravel的IOC組件探索依賴性注入設計模式,並查看如何改善我們的設計。

鑰匙要點

    依賴注入(DI)是一種設計模式,可以使硬編碼依賴關係解耦,從而使代碼更加靈活,可重複使用且易於測試。在Laravel的IOC(控制倒置)中,這是通過將所需的依賴項傳遞到外部對象而不是使對象創建依賴關係或要求工廠對象為其製作一個的對象來實現的。
  • > Laravel的IOC容器是管理類依賴性的強大工具。它控制瞭如何解決和創建不同對象。當一類具有依賴性時,容器會在類稱為“自動接線”的過程實例化時自動注入它們。
  • >
  • >使用綁定方法可以將服務綁定到Laravel的IOC容器。此方法接受兩個參數:解決服務時將使用的類或接口名稱,以及返回類實例的閉合。關閉將接收容器實例,使您可以解決實例化類所需的任何其他依賴項。
  • Laravel的IOC容器還允許接口綁定。這使您可以將接口綁定到給定的實現。然後,每當請求接口時,容器都會注入限制的實現。這進一步增強了代碼的靈活性和可重複性。
  • 依賴注入
依賴注入是由馬丁·福勒(Martin Fowler)創造的術語,這是將組件注入應用程序的行為。就像沃德·坎寧安(Ward Cunningham)一樣:

依賴注入是敏捷體系結構的關鍵要素。

讓我們看看一個示例:

如果要測試或維護此類,則必須訪問真實數據庫並進行一些查詢。為了避免必須這樣做,並從剩下的類中

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的依賴性,因此我們的代碼可能看起來像:>

Laravel的依賴注入這是這樣做的經典方式,讓我們從使用構造函數注入開始。

現在我們創建我們的對象:

<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>
現在,我想使用Laravel IOC來管理所有這些。 >

由於應用程序類擴展了容器類,因此您可以始終通過應用程序外觀訪問容器。

<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>
注意:如果您檢查Laravel包,則有時會將綁定如(view,view.finder ..)。

假設我們要將會話存儲切換到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>
>我們的SimpleAuth類不應該關注我們的存儲方式,而應該更多地專注於僅消費服務。

>

因此,我們可以抽像我們的存儲實現:


這樣,我們就可以實現並要求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,但是如果您的項目越來越大,則必須使用服務提供商。
    測試:
  • 剛剛進行測試時,您需要考慮使用PHP Artisan Tinker,它非常強大,並且可以增加Laravel測試工作流程。
  • 反射API:
  • PHP反射API非常強大,如果您想了解laravel ioc,您需要熟悉反射API,請務必檢查本教程以獲取更多信息。 >
  • 結論

  • >一如既往,了解某些內容的最佳方法是檢查源代碼。 Laravel IOC只是一個文件,不應該花您很長時間來完成所有功能。您想進一步了解Laravel IOC或IOC嗎?讓我們知道!
經常詢問有關Laravel 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中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
在Laravel中使用Flash會話數據在Laravel中使用Flash會話數據Mar 12, 2025 pm 05:08 PM

Laravel使用其直觀的閃存方法簡化了處理臨時會話數據。這非常適合在您的應用程序中顯示簡短的消息,警報或通知。 默認情況下,數據僅針對後續請求: $請求 -

php中的捲曲:如何在REST API中使用PHP捲曲擴展php中的捲曲:如何在REST API中使用PHP捲曲擴展Mar 14, 2025 am 11:42 AM

PHP客戶端URL(curl)擴展是開發人員的強大工具,可以與遠程服務器和REST API無縫交互。通過利用Libcurl(備受尊敬的多協議文件傳輸庫),PHP curl促進了有效的執行

簡化的HTTP響應在Laravel測試中模擬了簡化的HTTP響應在Laravel測試中模擬了Mar 12, 2025 pm 05:09 PM

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显著减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

在Codecanyon上的12個最佳PHP聊天腳本在Codecanyon上的12個最佳PHP聊天腳本Mar 13, 2025 pm 12:08 PM

您是否想為客戶最緊迫的問題提供實時的即時解決方案? 實時聊天使您可以與客戶進行實時對話,並立即解決他們的問題。它允許您為您的自定義提供更快的服務

如何註冊和使用Laravel服務提供商如何註冊和使用Laravel服務提供商Mar 07, 2025 am 01:18 AM

Laravel的服務容器和服務提供商是其架構的基礎。 本文探討了服務容器,詳細信息服務提供商創建,註冊,並通過示例演示了實際用法。 我們將從OVE開始

解釋PHP中晚期靜態結合的概念。解釋PHP中晚期靜態結合的概念。Mar 21, 2025 pm 01:33 PM

文章討論了PHP 5.3中介紹的PHP中的晚期靜態結合(LSB),允許靜態方法的運行時間分辨率調用以更靈活的繼承。 LSB的實用應用和潛在的觸摸

PHP記錄:PHP日誌分析的最佳實踐PHP記錄:PHP日誌分析的最佳實踐Mar 10, 2025 pm 02:32 PM

PHP日誌記錄對於監視和調試Web應用程序以及捕獲關鍵事件,錯誤和運行時行為至關重要。它為系統性能提供了寶貴的見解,有助於識別問題並支持更快的故障排除

自定義/擴展框架:如何添加自定義功能。自定義/擴展框架:如何添加自定義功能。Mar 28, 2025 pm 05:12 PM

本文討論了將自定義功能添加到框架上,專注於理解體系結構,識別擴展點以及集成和調試的最佳實踐。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
2 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
2 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能