我想在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
方法
一个合理的方法是覆盖模型类中的CActiveRecord::setAttribute
,使其按照需要的方式运行:
class M extends CActiveRecord {
....
public function setAttribute($name,$value) {
if($name === 'a') {
.. do something
}
return parent::setAttribute($name, $value);
}
....
}