cakephp - 模型和行为有什么区别?

时间:2011-08-30 20:24:12

标签: cakephp model behavior

我理解这种行为应该扩展模型并为其添加功能,但在大多数情况下,胖模型的想法会使行为变得无用,不是吗?

而且,甚至首选,忽略我的第一段,只是回答 - 请 - 标题中的问题,并添加一个示例以使其清楚

感谢

3 个答案:

答案 0 :(得分:23)

行为是您提取不属于某个特定模型域的代码的地方。有点像,辅助函数,或mixin /模块(如果你熟悉其他编程语言的模式)。

如果您熟悉CakePHP帮助程序和组件,可以像这样查看它。行为是模型作为助手是视图,因为组件是控制器。基本上是一组将在多个模型中使用的功能。

假设您要在应用程序的所有模型上实现软删除。 (软删除意思,你实际上不删除记录,你只需将其标记为已删除)。您不希望将相同的软删除代码放入每个模型中。那不是很干!相反,您使用行为来抽象出这样的功能。

我们要做的不是删除记录,而是使用当前日期更新已删除的列(它将以与创建,修改相同的方式工作)。然后我们将find方法更改为仅检索未删除的记录。

// 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
    }
}

我希望这会对你有所帮助。

答案 1 :(得分:3)

可以在模型之间共享行为。通常,行为包含可应用于任何模型的抽象代码。

虽然您当然可以专门针对单个模型编写此内容,但您必须再次为另一个模型编写它。通过抽象它来共享,您已经创建了一个行为

在CakePHP中,模型行为组件控制器帮助视图

CakePHP中的核心行为示例是Containable。这使您可以更好地控制find()中使用的关系。

答案 2 :(得分:1)

基本上,行为用于使您的应用程序干燥!和代码重用...

Check this link... it gives you simple tagging behavior which you can use in your post model