首頁 > 後端開發 > php教程 > Laravel的依賴注入

Laravel的依賴注入

Lisa Kudrow
發布: 2025-02-21 10:28:11
原創
511 人瀏覽過

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
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板