Yii-对属性模型赋值作出反应


Yii - reacting to attribute model assignation

我想在Yii中执行以下操作:

When the attribute `a` in my model class `M` is set, do something.

AND尝试使用类似:setA($value)的setter,但它没有被调用,因为Yii CActiveRecord首先检测属性是否存在于数据库中(并将其赋值),如果它不存在于数据库中(即它不是表属性),则会查找一个正常的实例变量。最后一个回退是调用属性访问器。

编辑-我的解析顺序有误:查找似乎首先是实例变量,然后是属性,最后是访问器-无论如何,我的问题仍然是一样的,因为如果不存在具有该名称的数据库字段,则会解析访问器)

这里展示了__set的内部机制(还有一点更高的__get)。

问题:至少对于某个属性,如何反转顺序?这意味着:我实际上想用setA($value)这样的设置器捕获数据库字段版本,在setA方法

中执行字段分配(即实际的$This->a,但应该在不发生堆栈溢出错误的情况下完成)

一个合理的方法是覆盖模型类中的CActiveRecord::setAttribute,使其按照需要的方式运行:

class M extends CActiveRecord {
  ....
  public function setAttribute($name,$value) {
    if($name === 'a') {
      .. do something
    }
    return parent::setAttribute($name, $value);
  }
  ....
}