6

我來自一個Java/Grails的背景,似乎無法找到一個明確的答案網上到哪裏了CakePHP的應用業務邏輯應存放。通過「服務」,我正在討論通常通過依賴注入實例化的類,以在域對象上執行業務邏輯。他們應該能夠查詢任何域對象,並根據控制器操作進行更改。CakePHP的:如果把「服務」的邏輯

目前,CakePHP的「分量」類似乎是最匹配的這種行爲。我可以將組件加載到任何控制器中並根據需要執行其方法。但是,我已經在幾個地方看到組件不應該訪問數據庫,並且這樣做會導致一些陡峭的性能命中。

我也看過CakePHP的「行爲」類,它似乎並不適合票。它似乎能夠將域對象組織到數據結構設置中,但這不是服務執行的邏輯。另外,要將任何模型定義導入到行爲中,我必須自己編輯模型定義以允許訪問,這非常尷尬。

所以我問這個問題:應該在哪裏服務存儲邏輯是什麼?當然不是控制器,因爲它應該只包含處理請求和發送響應的最小邏輯。

+1

這是一個免費的提示:遠離CakePHP。這是PHP中最糟糕的框架之一,它絕對不會像MVC那樣遠程實現。如果想要使用至少能夠識別「服務」概念的東西,可以嘗試Symfony2。 –

+0

參數1:全局狀態。 CakePHP基本上是基於單例和其他靜態範圍參數的使用。 –

+0

參數2:靜態類:大多數CakePHP核心都是由靜態方法組成的。這使得所有代碼都與特定的類名緊密結合,最終被用作名稱空間。 –

回答

6

組件是CakePHP中的服務層。它們由依賴注入容器(Components Collection)構造並通過要處理的控制器,請求和響應。

除了保持圖層之間的分離外,組件可以做什麼沒有限制。直接從組件使用數據庫連接或使用模型並修改請求是很好的。

成分其實非常輕量,如果你只會讓他們採取行動的具體情況。檢查操作名稱是限制組件範圍的常用方法。您還可以注入設置,以便可以知道什麼時候可以執行自定義服務邏輯。

-2

所以我問這個問題:應該在哪裏服務存儲邏輯是什麼? 當然不是控制器,因爲它應該只包含處理請求和發送響應的最小邏輯 。

聽起來像Dispatcher Filter的理想用例。即使在實例化控制器之前它也會被調用。如果您需要查詢數據庫,只需通過ClassRegistry :: init('YourModelName')加載模型並將請求參數傳遞給模型方法,並返回您的請求中所需的任何內容。根本不需要控制器。我們已經使用分派器過濾器實現了oauth + xhttp,而無需調用任何控制器。

如何使用組件內部的模型應該表現效果......我不知道是誰得到了奇怪的想法,聽起來好像不是你找到最好的文章。的確,您不應該將模型層相關的邏輯放入其中,但您可以通過控制器實例和控制器模型調用模型。

+0

「服務邏輯」主要表示存儲抽象和域實體之間的交互。你的答案與它無關。地獄......蛋糕甚至不會將模型層的兩個方面分開,因爲它使用activerecord來爲其「AppModel」類。 –

+0

@burzum經過一番閱讀,在我看來,DispatcherFilter對於諸如API調用之類的函數來說非常棒。但是,我的許多邏輯本質上都比較寬泛。例如,當我收到身份驗證失敗的POST請求時,我需要將失敗的登錄嘗試記錄到數據庫。雖然是一個簡單的概念,但是存在相當多的代碼來實例化新記錄,驗證並堅持它。這種計算不屬於控制器,因爲它不直接涉及請求或響應。你會不會推薦DispatcherFilter這樣的任務? – emagdne

+1

調度程序過濾器適用於中間件邏輯,但組件更適合他描述的內容 –