如何通过少数模型扩展类

时间:2012-06-24 20:48:48

标签: php yii

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


    public function behaviors()
    {
    return array(
        'timestamps' => array(
            'class' => 'zii.behaviors.CTimestampBehavior',
            'createAttribute' => 'created_on',
            'updateAttribute' => 'modified_on',
            'setUpdateOnCreate' => true,
            ),
        );
    }

以下是第二个变种:


    protected function beforeValidate()
    {
    if($this->getIsNewRecord())
        $this->created_on = time();
    $this->modified_on = time();
    return true;
    }

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

1 个答案:

答案 0 :(得分:0)

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

使用组件行为

组件支持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/