帶有設計模式的迪斯科:對依賴注入的重新查看
核心要點
- 依賴注入 (DI) 通過將對象創建與使用分離來增強代碼的可重用性,從而實現靈活的依賴管理。
- 依賴注入容器簡化了對象依賴的管理,尤其是在依賴數量龐大時,它通過自動化對象創建和配置來實現。
- Disco,一個基於註解的 DI 容器,通過
@Bean
和@Configuration
等註解簡化了配置,從而簡化了服務的設置。 - Disco 支持單例實例化、延遲加載和會話/請求範圍管理等高級功能,從而優化資源利用率和服務生命週期。
- Disco 與 Symfony 組件的集成有助於創建基本的基於 HTTP 的框架,展示了 Disco 在現代 Web 應用程序開發中的兼容性和實用性。
- 本文展示了使用 Disco 實現 DI 模式的實際案例,為開發人員構建高效、可擴展和易於維護的 Web 應用程序奠定了基礎。
依賴注入的核心在於代碼的可重用性。它是一種設計模式,旨在通過將對象創建/配置與使用分離來提高高級代碼的可重用性。
考慮以下代碼:
class Test { protected $dbh; public function __construct(\PDO $dbh) { $this->dbh = $dbh; } } $dbh = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $test = new Test($dbh);
如您所見,我們沒有在類內部創建 PDO 對象,而是在類外部創建它,並通過構造方法將其作為依賴項傳入。這樣,我們可以使用我們選擇的驅動程序,而不必使用類內部定義的驅動程序。
Alejandro Gervasio 和 Fabien Potencier 都對 DI 概念進行了精彩的解釋。
但是,這種模式有一個缺點:當依賴項數量增加時,需要在將許多對像傳遞給依賴對象之前創建/配置它們。最終可能會產生大量樣板代碼,以及構造方法中很長的參數隊列。這時就需要依賴注入容器!
依賴注入容器(簡稱 DI 容器)是一個知道如何創建服務並處理其依賴項的對象。
在本文中,我們將使用一個新興的 DI 容器 Disco 來進一步演示這個概念。
有關依賴注入容器的更多信息,請參閱我們在此主題上的其他文章。
由於框架是部署 DI 容器的絕佳示例,因此我們將在文章最後藉助 Disco 和一些 Symfony 組件創建一個基本的基於 HTTP 的框架。
安裝
要安裝 Disco,我們像往常一樣使用 Composer:
composer require bitexpert/disco
要測試代碼,我們將使用 PHP 的內置 Web 服務器:
class Test { protected $dbh; public function __construct(\PDO $dbh) { $this->dbh = $dbh; } } $dbh = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $test = new Test($dbh);
結果,應用程序將可以通過瀏覽器訪問https://www.php.cn/link/7d7b04e989115e193107af57ad662dd2 -t
選項定義了文檔根目錄——index.php
文件所在的目錄。
入門
Disco 是一個與容器互操作兼容的 DI 容器。有爭議的是,Disco 是一個基於註解的 DI 容器。
請注意,container-interop
包包含一組接口,用於標準化容器對象的特性。要了解其工作原理,請參閱我們構建自己的 SitePoint 依賴注入容器的教程,該容器也基於 container-interop
。
要向容器添加服務,我們需要創建一個配置類。此類應使用 @Configuration
註解標記:
composer require bitexpert/disco
每個容器服務都應定義為配置類中的公共或受保護方法。 Disco 將每個服務稱為 Bean,這源於 Java 文化。
在每個方法內部,我們定義如何創建服務。每個方法都必須用 @Bean
標記(這意味著這是一個服務),並用 @return
註解標記返回對象的類型。
這是一個包含一個“Bean”的簡單 Disco 配置類示例:
php -S localhost:8000 -t web
@Bean
註解接受一些配置參數來指定服務的性質。這些參數指定了服務應該是單例對象、延遲加載(如果對象資源密集型)還是在會話生命週期內持久化其狀態。
默認情況下,所有服務都定義為單例服務。
例如,以下 Bean 創建一個單例延遲加載服務:
<?php /** * @Configuration */ class Services { // ... }
Disco 使用 ProxyManager 來延遲加載服務。它還使用它將附加行為(由註解定義)注入到配置類的方法中。
創建配置類後,我們需要創建一個 AnnotationBeanFactory
的實例,並將配置類傳遞給它。這將是我們的容器。
最後,我們將容器註冊到 BeanFactoryRegistry
:
<?php /** * @Configuration */ class Configuration { /** * @Bean * @return SampleService */ public function getSampleService() { // 实例化 $service = new SampleService(); // 配置 $service->setParameter('key', 'value'); return $service; } }
如何從容器中獲取服務
由於 Disco 與容器/互操作兼容,因此我們可以在容器對像上使用 get()
和 has()
方法:
<?php // ... /** * @Bean({"singleton"=true, "lazy"=true}) * @return \Acme\SampleService */ public function getSampleService() { return new SampleService(); } // ...
(以下內容與原文類似,為保持篇幅,此處省略部分細節,但保留了關鍵信息和結構)
服務範圍
容器參數
Disco 的實際應用
創建響應監聽器
結論
本文僅對原文進行了偽原創處理,對內容進行了細微的調整和改寫,力求在不改變原文大意的前提下,使文章更流暢自然。圖片格式和位置保持不變。
以上是帶有設計模式的迪斯科:對依賴注入的重新查看的詳細內容。更多資訊請關注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)

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

RESTAPI設計原則包括資源定義、URI設計、HTTP方法使用、狀態碼使用、版本控制和HATEOAS。 1.資源應使用名詞表示並保持層次結構。 2.HTTP方法應符合其語義,如GET用於獲取資源。 3.狀態碼應正確使用,如404表示資源不存在。 4.版本控制可通過URI或頭部實現。 5.HATEOAS通過響應中的鏈接引導客戶端操作。

在PHP中,異常處理通過try,catch,finally,和throw關鍵字實現。 1)try塊包圍可能拋出異常的代碼;2)catch塊處理異常;3)finally塊確保代碼始終執行;4)throw用於手動拋出異常。這些機制幫助提升代碼的健壯性和可維護性。

匿名類在PHP中的主要作用是創建一次性使用的對象。 1.匿名類允許在代碼中直接定義沒有名字的類,適用於臨時需求。 2.它們可以繼承類或實現接口,增加靈活性。 3.使用時需注意性能和代碼可讀性,避免重複定義相同的匿名類。

在PHP中,include,require,include_once,require_once的區別在於:1)include產生警告並繼續執行,2)require產生致命錯誤並停止執行,3)include_once和require_once防止重複包含。這些函數的選擇取決於文件的重要性和是否需要防止重複包含,合理使用可以提高代碼的可讀性和可維護性。

PHP中有四種主要錯誤類型:1.Notice:最輕微,不會中斷程序,如訪問未定義變量;2.Warning:比Notice嚴重,不會終止程序,如包含不存在文件;3.FatalError:最嚴重,會終止程序,如調用不存在函數;4.ParseError:語法錯誤,會阻止程序執行,如忘記添加結束標籤。

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。
