示例...
人物 - 表格的字段:
现在,让我们假设我的代码中有$ person模型。我希望每次调用$person->name='TheName'
Yii称为我的自定义函数$person->setName('TheName')
,强制执行setter。
有没有办法实现这个目标?
我试图让模型的属性受到保护/私有,但它不起作用。 Yii似乎仅调用setter / getter AFTER来检查该属性是否存在于表中。当属性存在时,yii设置它并且不调用setter。
提前致谢。
更新:原因是我已经在一个系统中使用了$ model-> attribX,但现在我需要实现某些触发更新的取决于$ model-> attribX的更新和我不想通过'$ model-> changeAttribX(...)'之类的东西来改变所有'$ model-> attribX';
答案 0 :(得分:2)
Yii在__get
中__set
和CActiveRecord
的实施与CComponent
中的“标准”实施不同;后者检查(并且更喜欢使用)属性的getter和setter,而前者根本不会这样做。
要直接回答您的问题:您需要将此功能构建到您自己的班级中,并将上述two implementations作为指南,例如:对于二传手来说有点像这样:
public function setAttribute($name,$value)
{
$setter='set'.$name;
if(method_exists($this,$setter))
$this->$setter($value);
else if(property_exists($this,$name))
$this->$name=$value;
else if(isset($this->getMetaData()->columns[$name]))
$this->_attributes[$name]=$value;
else
return false;
return true;
}
此实现优先于裸属性上的getter和setter,这可能是您想要的,也可能不是。像这样继承CActiveRecord
后,你可以从子类派生自己的模型。
重要的考虑因素:同样,你没有说出你想要使用这个功能实现什么,这就引发了一些问题。例如,通常使用这样的功能来验证值,但是Yii有自己的验证系统。 有可能有更好的(更像Yii的)方式来做你想做的事。
答案 1 :(得分:0)
我从你的问题中得到的是 - “我希望在字段保存在数据库之前做一些事情”。如果这是问题,您可以覆盖beforeSave()方法。
public function beforeSave() {
if (count($this->name) > 100)
echo "how come your name is so big?";
return parent::beforeSave();
}