2011-08-30 55 views
6

我知道這種行爲應該是擴展模型併爲其添加功能,但在大多數情況下,胖模型的想法使這種行爲變得毫無用處,不是嗎?cakephp - 模型和行爲之間有什麼區別?

而且,即使是首選,無視我的第一款,只是回答 - 請 - 標題中的問題,並添加一個例子,以明確

感謝

回答

22

行爲是在那裏你提取的代碼,並沒有真正在一個特定的模式域歸屬。有點像,輔助函數或者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 
    } 
} 

我希望這可以幫助你。

+0

很好的回答!非常可讀和可理解的代碼示例!謝謝。 – yossi

+0

不客氣的Yossi。我希望這不會太長時間! –

+0

不,這是完美的..那是爲什麼..你可以檢查一下嗎? http://stackoverflow.com/questions/7278357/cakephp-creating-new-user-account-several-problems/7278402#7278402 – yossi

3

行爲可以型號之間共享。行爲通常包含抽象代碼,可應用於任何模型。

雖然您當然可以爲單個模型編寫此代碼,但您必須再次爲另一個模型編寫代碼。通過將其抽象爲共享,您已創建行爲

在CakePHP一個行爲模型是作爲元器件相同的關係,以一個控制器助手視圖

CakePHP中核心行爲的一個例子是Containable。這使您可以更好地控制find()中使用的關係。

相關問題