2011-08-30 56 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()中使用的关系。

相关问题