我知道這種行爲應該是擴展模型併爲其添加功能,但在大多數情況下,胖模型的想法使這種行爲變得毫無用處,不是嗎?cakephp - 模型和行爲之間有什麼區別?
而且,即使是首選,無視我的第一款,只是回答 - 請 - 標題中的問題,並添加一個例子,以明確
感謝
我知道這種行爲應該是擴展模型併爲其添加功能,但在大多數情況下,胖模型的想法使這種行爲變得毫無用處,不是嗎?cakephp - 模型和行爲之間有什麼區別?
而且,即使是首選,無視我的第一款,只是回答 - 請 - 標題中的問題,並添加一個例子,以明確
感謝
行爲是在那裏你提取的代碼,並沒有真正在一個特定的模式域歸屬。有點像,輔助函數或者mixin /模塊(如果你熟悉來自其他編程語言的模式)。
如果您熟悉CakePHP幫助程序和組件,則可以像這樣查看它。模型作爲幫助者的行爲是將組件視爲控制器。基本上是一組將在多個模型中使用的功能。
假設您想對應用程序中的所有模型執行軟刪除。 (軟刪除的意思,你不實際刪除記錄,你只需將其標記爲已刪除)。您不希望將相同的軟刪除代碼放入每個模型中。這不是很乾!相反,您使用行爲來抽象出如此的功能。
我們想要做的不是刪除記錄,而是用當前日期更新已刪除列(它將以與創建,修改相同的方式)。然後,我們將更改查找方法以僅檢索未刪除的記錄。
// models/behaviors/soft_deletable.php
class SoftDeletableBehavior extends ModelBehavior {
function setup(&$Model, $settings = array()) {
// do any setup here
}
// override the delete function (behavior methods that override model methods take precedence)
function delete(&$Model, $id = null) {
$Model->id = $id;
// save the deleted field with current date-time
if ($Model->saveField('deleted', date('Y-m-d H:i:s'))) {
return true;
}
return false;
}
function beforeFind(&$Model, $query) {
// only include records that have null deleted columns
$query['conditions']["{$Model->alias}.deleted <>"] = '';
return $query;
}
}
在模型
Class User extends AppModel {
public $actsAs = array('SoftDeletable');
}
從你的控制器
然後,您可以撥打我們所有的行爲方式對你的模型
Class UsersControllers extends AppController {
function someFunction() {
$this->User->delete(1); // soft deletes user with id of 1
$this->User->find('all'); // this will not exclude user with an id of 1
}
}
我希望這可以幫助你。
行爲可以型號之間共享。行爲通常包含抽象代碼,可應用於任何模型。
雖然您當然可以爲單個模型編寫此代碼,但您必須再次爲另一個模型編寫代碼。通過將其抽象爲共享,您已創建行爲。
在CakePHP一個行爲到模型是作爲元器件相同的關係,以一個控制器或助手到視圖。
CakePHP中核心行爲的一個例子是Containable。這使您可以更好地控制find()
中使用的關係。
基本上行爲是用來使您的應用程序幹!和代碼重用...
Check this link... it gives you simple tagging behavior which you can use in your post model
很好的回答!非常可讀和可理解的代碼示例!謝謝。 – yossi
不客氣的Yossi。我希望這不會太長時間! –
不,這是完美的..那是爲什麼..你可以檢查一下嗎? http://stackoverflow.com/questions/7278357/cakephp-creating-new-user-account-several-problems/7278402#7278402 – yossi