有没有办法在Yii模型中保护表字段以强制模型中的getter / setter?

时间:2012-03-28 06:00:18

标签: php activerecord yii

示例...

人物 - 表格的字段:

  • id_person
  • 名称

现在,让我们假设我的代码中有$ person模型。我希望每次调用$person->name='TheName' Yii称为我的自定义函数$person->setName('TheName'),强制执行setter。

有没有办法实现这个目标?

我试图让模型的属性受到保护/私有,但它不起作用。 Yii似乎调用setter / getter AFTER来检查该属性是否存在于表中。当属性存在时,yii设置它并且不调用setter。

提前致谢。

更新:原因是我已经在一个系统中使用了$ model-> attribX,但现在我需要实现某些触发更新的取决于$ model-> attribX的更新和我不想通过'$ model-> changeAttribX(...)'之类的东西来改变所有'$ model-> attribX';

2 个答案:

答案 0 :(得分:2)

Yii在__get__setCActiveRecord的实施与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();
}