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

yos*_*ssi 6 cakephp model behavior

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

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

谢谢

Bra*_*ell 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的模型中

Class User extends AppModel {
    public $actsAs = array('SoftDeletable');
}
Run Code Online (Sandbox Code Playgroud)

从控制器中,您可以在模型上调用我们的所有行为方法

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
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望这可以帮助你.