搜尋
首頁後端開發php教程建構 Symfony 專案的另一種方法

MVC 服務架構在 Symfony 專案中非常常見,感覺像是唯一的方法。它簡單、熟悉、有效……直到它不起作用為止。隨著專案的成長,裂縫開始顯現:業務邏輯無所不在,應用程式行為不清楚,維護程式碼變得痛苦。雖然這是最常見的方法,但 Symfony 並不強迫您堅持使用它。

如果有更好的方法呢?


使用 MVC 服務架構的挫折

 

領域邏輯無所不在

隨著專案的發展,業務邏輯往往會分佈在整個程式碼庫中。專案的每一層——控制器、服務、表單、實體——最終都包含網域模型的各個部分。這使得專注於任何特定部分變得越來越困難。

 

專案邊界不明確

當您的架構是圍繞技術層組織的時,隨著專案的發展,識別不同上下文之間的清晰邊界變得更加困難。這種缺乏清晰度可能會導致緊密耦合的程式碼和維護挑戰。

Another Way to Structure your Symfony Project

 

項目行為不明確

由於預設架構強調技術層,因此理解專案的行為變得相當具有挑戰性。您可能會推斷某些實體由特定服務管理或猜測資料庫模式,但專案的實際行為(最重要的方面)仍然不清楚和隱含。

Another Way to Structure your Symfony Project

 

不同的生命週期

當業務邏輯分散在整個專案中並與實作細節混合時,很難獨立地發展它們。隨著時間的推移,業務邏輯的生命週期往往比實作細節(例如框架、第三方 API 或資料庫)的生命週期長得多。每當依賴項中發生哪怕是很小的更改時,這種不匹配都會迫使您重寫大部分程式碼。


建構架構的更好方法

 

隔離業務邏輯

為了在需要時更容易專注於業務邏輯,第一步是將其與專案的其餘部分隔離。為此,請建立一個 Domain 資料夾。該資料夾成為專案的核心,其中業務邏輯使用純 PHP 物件進行建模,不依賴實作細節。雖然專案的其餘部分依賴於此資料夾,但 Domain 資料夾不依賴任何人。

在「域」資料夾內,文件應按域目的而不是技術目的進行分組。這意味著這裡沒有實體、服務或控制器資料夾,只有與功能或網域概念相對應的資料夾名稱。

Another Way to Structure your Symfony Project

 

域的前門

專案最重要的方面是它做什麼,它可以處理的操作。這些操作代表了專案的行為,並且應該作為存取業務邏輯的唯一方法。為了反映這一點,請建立一個 Application 資料夾,明確展示專案的所有行為。例如,作為專案的新開發人員,我應該能夠透過查看此資料夾一眼就了解該專案能夠做什麼。

Another Way to Structure your Symfony Project

 

連結外部世界

使用 AppDomain 資料夾,可以輕鬆專注於業務邏輯。然而,在某些時候,這個業務邏輯需要與外部系統互動。要處理此問題,請建立第三個名為 Infrastruct 的資料夾,其中包含所有實作細節,例如特定於框架的程式碼、資料庫連線和程式庫。

Infra設施資料夾中的檔案取決於App和Domain檔案。例如,他們可能從 App 資料夾呼叫應用程式處理程序或實作 Domain 資料夾中定義的介面。

Another Way to Structure your Symfony Project

具體來說,在 Symfony 中,這涉及修改 Controller 資料夾並聲明哪些服務實作哪些介面。

# config/routes.yaml

controllers:
    resource:
        path: ../src/Catalog/Infrastructure/Controller/
        namespace: App\Catalog\Infrastructure\Controller
    type: attribute

 

揭示界限

隨著專案的發展,您可能會注意到業務邏輯的某些部分值得在架構中擁有自己的空間。一個好的指標是同一個術語根據上下文開始具有不同的意義。例如,「產品」一詞可能指的是工廠產品、倉庫產品或電子商務產品,每種產品都需要自己的模型。神物也可以是一個很好的指標; User 類別在 Symfony 專案中經常出現此類問題。

當這種情況發生時,就該將其提取出來並讓其業務邏輯獨立演化。

一些上下文將構成您專案的核心,而其他上下文將支持它。通用上下文(例如 Auth)可以使用更簡單的架構,因為它們不是您的網域的中心

Another Way to Structure your Symfony Project

在這張圖中,我們可以看到 Auth 上下文使用標準的 Symfony 結構,Order 和 Catalog 上下文使用以域為中心的架構,Shipping 上下文使用以功能為中心的架構。

 

增量模組化

如果特定情境成長到需要獨立擴充的程度,請考慮將其拆分為單獨的部署單元。

但是,不要急於進行這一步。首先使您的專案模組化,如果您發現上下文需要單獨擴展,請單獨部署它。
只有在出現組織挑戰時才拆分程式碼庫,例如兩個團隊在同一程式碼庫上難以協作。

Another Way to Structure your Symfony Project

走得更遠
  • Simon Brown - 模組化巨石

概念

在探索這些解決方案時,我們應用了一些製程概念。讓我們命名並簡要解釋它們,以便您可以更深入地了解每一個。

 

無所不在的語言

這個不尋常的術語背後隱藏著一個非常簡單的概念。通用語言是您的團隊用來描述領域模型的詞彙。這些詞彙應該記錄在案,並在產品對話、程式碼庫等各處一致使用。

具體來說,在有界上下文的根部創建一個 markdown 文件,並將產品人員、領域專家和技術團隊聚集在一起來定義專案的每個概念。

走得更遠

  • Eric Evans - DDD - 第 2 章:溝通與語言的使用
  • 馬丁·福勒 - 無所不在的語言

 

有界上下文

有界上下文定義了專案內的語言邊界,分隔了系統中通用語言不再對齊的部分。上下文地圖和事件風暴等工具可以幫助識別這些邊界。

有界上下文是一個抽象概念;它可以透過多種方式實現,從模組化整體中的簡單資料夾到微服務架構中的叢集。

走得更遠

  • Eric Evans - DDD - 第四部分:策略設計
  • Vaughn Vernon - IDDD - 第 2 章:域、子域和有界上下文
  • Martin Fowler - 有界上下文

 

連接埠和適配器、六邊形、洋蔥形和簡潔架構

所有這些架構的目的是將業務邏輯與實作細節隔離。無論您使用連接埠和適配器、六角形還是乾淨架構,核心思想都是使業務邏輯框架與框架無關且易於測試。

一旦您記住了這一點,就會有各種各樣的實現,而最好的實現取決於您的上下文和偏好。這種架構的一個主要優點是,透過隔離您的業務邏輯,它可以實現更有效率的測試。

走得更遠

  • Alistair Cockburn - 六角形建築
  • 叔叔鮑伯 - 乾淨的建築
  • Herberto Graca - DDD、六邊形、洋蔥、清潔、CQRS,…我如何將它們放在一起

 

尖叫建築

組織資料夾和文件以「尖叫」業務邏輯的想法稱為尖叫架構。這個概念強調程式碼的結構應該使專案的目的立即清晰。目標是讓新開發人員一目了然地了解專案的用途。

我強烈建議閱讀鮑伯叔叔關於這個主題的文章 - 他與房屋規劃的比較特別富有洞察力。

走得更遠

  • 叔叔鮑伯 - 尖叫建築

 

垂直切片架構

垂直切片按功能組織您的項目,允許每個功能獨立發展。它使您能夠根據複雜性和成熟度將不同的架構應用於不同的功能。

雖然這個想法很有趣,但它需要高技能的工程師來有效地實現和維護這樣的架構。

走得更遠

  • Jimmy Bogard - 垂直切片架構
  • CodeOpinion - 垂直切片架構,而不是層!

最後的想法

建構 Symfony 專案的方式對其可擴展性、可維護性和清晰度有著深遠的影響。透過隔離您的業務邏輯並使行為明確,您將創建一個更易於理解和發展的系統。

如果您對這些想法不熟悉,請不要擔心,軟體工藝是一個旅程,而不是目的地。這些概念一開始可能看起來令人難以接受,但每個概念都將幫助您為您的業務創造更多價值。

有疑問或想分享您的經驗嗎?將它們放入評論中!請繼續關注下一篇文章?

以上是建構 Symfony 專案的另一種方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
unset()和session_destroy()有什麼區別?unset()和session_destroy()有什麼區別?May 04, 2025 am 12:19 AM

Thedifferencebetweenunset()andsession_destroy()isthatunset()clearsspecificsessionvariableswhilekeepingthesessionactive,whereassession_destroy()terminatestheentiresession.1)Useunset()toremovespecificsessionvariableswithoutaffectingthesession'soveralls

在負載平衡的情況下,什麼是粘性會話(會話親和力)?在負載平衡的情況下,什麼是粘性會話(會話親和力)?May 04, 2025 am 12:16 AM

stickysessensureuserRequestSarerOutedTothesMeServerForsessionDataConsisterency.1)sessionIdentificeAssificationAssigeaSsignAssignSignSuserServerServerSustersusiseCookiesorUrlModifications.2)一致的ententRoutingDirectSsssssubsequeSssubsequeSubsequestrequestSameSameserver.3)loadBellankingDisteributesNebutesneNewuserEreNevuseRe.3)

PHP中有哪些不同的會話保存處理程序?PHP中有哪些不同的會話保存處理程序?May 04, 2025 am 12:14 AM

phpoffersvarioussessionsionsavehandlers:1)文件:默認,簡單的ButMayBottLeneckonHigh-trafficsites.2)Memcached:高性能,Idealforsforspeed-Criticalapplications.3)REDIS:redis:similartomemememememcached,withddeddeddedpassistence.4)withddeddedpassistence.4)databases:gelifforcontrati forforcontrati,有用

PHP中的會話是什麼?為什麼使用它們?PHP中的會話是什麼?為什麼使用它們?May 04, 2025 am 12:12 AM

PHP中的session是用於在服務器端保存用戶數據以在多個請求之間保持狀態的機制。具體來說,1)session通過session_start()函數啟動,並通過$_SESSION超級全局數組存儲和讀取數據;2)session數據默認存儲在服務器的臨時文件中,但可通過數據庫或內存存儲優化;3)使用session可以實現用戶登錄狀態跟踪和購物車管理等功能;4)需要注意session的安全傳輸和性能優化,以確保應用的安全性和效率。

說明PHP會話的生命週期。說明PHP會話的生命週期。May 04, 2025 am 12:04 AM

PHPsessionsstartwithsession_start(),whichgeneratesauniqueIDandcreatesaserverfile;theypersistacrossrequestsandcanbemanuallyendedwithsession_destroy().1)Sessionsbeginwhensession_start()iscalled,creatingauniqueIDandserverfile.2)Theycontinueasdataisloade

絕對會話超時有什麼區別?絕對會話超時有什麼區別?May 03, 2025 am 12:21 AM

絕對會話超時從會話創建時開始計時,閒置會話超時則從用戶無操作時開始計時。絕對會話超時適用於需要嚴格控制會話生命週期的場景,如金融應用;閒置會話超時適合希望用戶長時間保持會話活躍的應用,如社交媒體。

如果會話在服務器上不起作用,您將採取什麼步驟?如果會話在服務器上不起作用,您將採取什麼步驟?May 03, 2025 am 12:19 AM

服務器會話失效可以通過以下步驟解決:1.檢查服務器配置,確保會話設置正確。 2.驗證客戶端cookies,確認瀏覽器支持並正確發送。 3.檢查會話存儲服務,如Redis,確保其正常運行。 4.審查應用代碼,確保會話邏輯正確。通過這些步驟,可以有效診斷和修復會話問題,提升用戶體驗。

session_start()函數的意義是什麼?session_start()函數的意義是什麼?May 03, 2025 am 12:18 AM

session_start()iscucialinphpformanagingusersessions.1)ItInitiateSanewsessionifnoneexists,2)resumesanexistingsessions,and3)setsasesessionCookieforContinuityActinuityAccontinuityAcconActInityAcconActInityAcconAccRequests,EnablingApplicationsApplicationsLikeUseAppericationLikeUseAthenticationalticationaltication and PersersonalizedContentent。

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脫衣器

Video Face Swap

Video Face Swap

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

熱工具

MantisBT

MantisBT

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

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。