0

所以我有一个这样的模型:

class MyClass 
{
     public $customer = null;
     public $address = null;
}

像这样的形式:

class MyForm extends CFormModel
{ 
     public $customer = null;
     public $address = null;

     /**
     * Declares the validation rules.
     */
     public function rules()
     {
         return array(
         array('customer, address', 'required'),
         array('verifyCode', 'captcha', 'allowEmpty'=>!CCaptcha::checkRequirements()),
     );

     /**
      * Declares customized attribute labels.
      * If not declared here, an attribute would have a label that is
      * the same as its name with the first letter in upper case.
     */
     public function attributeLabels()
     {
         return array(
               'verifyCode'=>'Verification Code',
         );
     }
}

我想做的是在我的表单中扩展模型,但是你不能在 PHP 中进行多对象继承。

我将如何做到这一点,以避免在表单中复制模型的所有字段属性?

4

1 回答 1

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();

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

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

行为的属性也可以通过它所附加的组件来访问。属性包括公共成员变量和通过行为的 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/

于 2012-06-19T06:22:49.103 回答