我理解这种行为应该扩展模型并为其添加功能,但在大多数情况下,胖模型的想法会使行为变得无用,不是吗?
而且,甚至首选,忽略我的第一段,只是回答 - 请 - 标题中的问题,并添加一个示例以使其清楚
感谢
答案 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