我知道这种行为应该是扩展模型并为其添加功能,但在大多数情况下,胖模型的想法使这种行为变得毫无用处,不是吗?cakephp - 模型和行为之间有什么区别?
而且,即使是首选,无视我的第一款,只是回答 - 请 - 标题中的问题,并添加一个例子,以明确
感谢
我知道这种行为应该是扩展模型并为其添加功能,但在大多数情况下,胖模型的想法使这种行为变得毫无用处,不是吗?cakephp - 模型和行为之间有什么区别?
而且,即使是首选,无视我的第一款,只是回答 - 请 - 标题中的问题,并添加一个例子,以明确
感谢
行为是在那里你提取的代码,并没有真正在一个特定的模式域归属。有点像,辅助函数或者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
}
}
我希望这可以帮助你。
行为可以型号之间共享。行为通常包含抽象代码,可应用于任何模型。
虽然您当然可以为单个模型编写此代码,但您必须再次为另一个模型编写代码。通过将其抽象为共享,您已创建行为。
在CakePHP一个行为到模型是作为元器件相同的关系,以一个控制器或助手到视图。
CakePHP中核心行为的一个例子是Containable。这使您可以更好地控制find()
中使用的关系。
基本上行为是用来使您的应用程序干!和代码重用...
Check this link... it gives you simple tagging behavior which you can use in your post model
很好的回答!非常可读和可理解的代码示例!谢谢。 – yossi
不客气的Yossi。我希望这不会太长时间! –
不,这是完美的..那是为什么..你可以检查一下吗? http://stackoverflow.com/questions/7278357/cakephp-creating-new-user-account-several-problems/7278402#7278402 – yossi