2012-09-21 19 views
3

我想知道CakePHP的控制器是否應該不包含任何不能被URL訪問的私有函數。控制器是否應該避免在CakePHP中使用私有函數?

有時一些功能,例如添加刪除可以如此之大,我更喜歡將兩者隔開。 我應該把這些功能放在模型裏面,而不是在控制器上做私人的嗎?

謝謝。

+0

你應該沒有必要使用私有方法。改爲使用保護。在一個框架環境中,使某些事情變得私人化是沒有意義的,因爲在某個時候,每個階級都可以在某個時間延長。但控制器內的受保護方法非常普遍。 – mark

回答

4

是的,如果你在模型中保留你的方法可能是最好的。就像你自己在評論中提到的那樣,「保持模型胖和控制器很薄」。控制器只是一個應該在模型和視圖之間進行交互的媒介。

問題出現在您必須處理數據源表中的更改時。如果你的控制器很胖,你可能會到處使用這些字段,現在你將在清理整個設置的時候,把它放在一個不應該是的地方。

模型中方法的附加好處是您可以從其他模型調用它並重用代碼。例如

class User extends AppModel { 

    public function getAllActiveUsers() { 
     // return active users 
    } 

} 

上述方法可以通過與用戶相關的模型和控制器中的每個其他方法來訪問。

如果你在其他地方需要這樣的功能,如果你沒有他們的用戶模型中定義的,你要麼最終它重定向到控制器或全部重新編寫的整個邏輯。

重定向的事情並不壞,但考慮如果u有其他地方重寫邏輯,如果你的ActiveUsers變化實施,U最終會修正無處不在。

但是,有幾件事情必須在控制器中完成。例如,如果我必須計算用戶的地理位置和所有匹配的餐館之間的距離,我應該在控制器中執行此操作。但控制器的利益最爲重要,因此存在組件。您可以爲複雜冗長的邏輯創建自定義組件。

+0

如何區分必須在控制器中的功能和必須在模型中的功能? – Alvaro

+0

那麼,可能與插入或取出記錄有關的所有內容都將包含在與插入和提取相關的前置和後置邏輯的模型中。 但是,解釋/計算/從數據甚至涉及其他模型的數據最好保存在控制器中。 「控制器將數據呈現給查看」。 控制流方法必須在控制器中。像認證的東西。與第三方交互的方法,如電子郵件,其他API或甚至打開您的API。 –

+0

因此,在控制器上使用私有(或受保護)功能是沒有問題的,而這些功能無法通過url訪問。 (如果他們只使用數據而不使用任何模型) – Alvaro

-2

不需要。CakePHP是一個框架,您可以隨意爲邏輯的可重用位創建私有函數。這可能是鼓勵。

+0

贊成票反對的理由將不勝感激。 –

1

我在模型中放置了較低級別的函數。特別是如果該功能可以被多個控制器使用。我認爲「低級」儘可能接近模型數據。如果您要對數據進行特定於視圖的修改或將其與其他模型的數據相結合(相關模型是例外),則該函數不屬於模型。

此外,你可以前綴與下劃線任何控制器功能,它不會通過URL可用。

1

處理從數據庫添加和刪除條目的邏輯是域業務邏輯的一部分。這些方法應該是模型層的一部分。

由於CakePHP的實現極爲有限(它假裝模型層是活動的記錄實例的集合),你可能會移動的方法,以某種傭工,或使用不同的「模式」,不從AppModel繼承。相反,這樣的結構將能夠像服務一樣行事,這些服務將控制器(和表示層整體)與域業務邏輯隔離開來。

相關問題