【问题标题】:How can class can be extended by few models少数模型如何扩展类
【发布时间】:2012-06-26 05:19:12
【问题描述】:

yii 组件 gii 生成的模型很少。现在我想做自动插入作者、创建和更新时间。在 Yii Cookbook 中它是存在的。第一个变体:

公共功能行为() { 返回数组( '时间戳' => 数组( 'class' => 'zii.behaviors.CTimestampBehavior', 'createAttribute' => 'created_on', 'updateAttribute' => 'modified_on', 'setUpdateOnCreate' => 真, ), ); }

这是第二个变体:

受保护的函数 beforeValidate() { if($this->getIsNewRecord()) $this->created_on = time(); $this->modified_on = time(); 返回真; }

在我的情况下,我应该在扩展它的每个模型中创建将替换 beforeSave 方法的类。错了吗?

【问题讨论】:

  • 你需要在这里展示你的作品。没有人有太多空闲时间来查看您提到的这本书。所以,编辑你的问题。

标签: php yii


【解决方案1】:

您需要在行为中实现它,并将该行为附加到您希望发生这种情况的每个类。

组件行为的使用

组件支持mixin 模式并且可以附加一个或多个行为。行为是一个对象,其方法可以通过收集功能而不是专门化(即普通类继承)的方式由其附加组件“继承”。一个组件可以附加多个行为,从而实现“多重继承”。

行为类必须实现IBehavior 接口。大多数行为都可以从CBehavior 基类扩展。如果需要将行为附加到模型,它也可以从 CModelBehaviorCActiveRecordBehavior 扩展,实现模型的附加功能。

要使用行为,必须首先通过调用行为的attach() 方法将其附加到组件。然后我们可以通过组件调用行为方法:

// $name uniquely identifies the behavior in the component
$component->attachBehavior($name,$behavior);
// test() is a method of $behavior
$component->test();

附加的行为可以像组件的普通属性一样被访问。例如,如果一个名为 tree 的行为附加到一个组件,我们可以使用以下方法获取对该行为对象的引用:

$behavior=$component->tree;
// equivalent to the following:
// $behavior=$component->asa('tree');

可以暂时禁用行为,使其方法无法通过组件使用。例如,

$component->disableBehavior($name);
// the following statement will throw an exception
$component->test();
$component->enableBehavior($name);
// it works now
$component->test();

附加到同一组件的两个行为可能具有相同名称的方法。在这种情况下,第一个附加行为的方法将优先。

events 一起使用时,行为更加强大。一个行为,当被附加到一个组件时,可以将它的一些方法附加到组件的一些事件上。这样,行为就有机会观察或改变组件的正常执行流程。

行为的属性也可以通过它所附加的组件来访问。这些属性包括公共成员变量和通过行为的 getter 和/或 setter 定义的属性。例如,如果行为具有名为 xyz 的属性,并且该行为附加到组件 $a。然后我们可以使用表达式$a->xyz 来访问行为的属性。

更多阅读:
http://www.yiiframework.com/wiki/44/behaviors-events
http://www.ramirezcobos.com/2010/11/19/how-to-create-a-yii-behavior/

【讨论】:

  • 感谢您的回答,但我不确定我是否理解行为。除了官方网站,我在哪里可以阅读这些?我是说文学。
  • 您拥有的手册是一个很好的统计数据,它将对您有所帮助。它解释了如何做这些课程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
相关资源
最近更新 更多