2012-03-28 6 views
1

例...Yiiモデルでテーブルフィールドを保護して、モデルにゲッタ/セッターを強制する方法はありますか?

人 - テーブルのフィールド:

  • id_person

さて、私は私のコードでモデルの$の人を持っていると仮定してみましょう。私はいつも$person->name='TheName'と呼ばれていました.Yiiは私のカスタマイズした機能$person->setName('TheName')と呼ばれ、セッターを強制しています。

これを達成する方法はありますか?

私はモデルの属性をprotected/privateにしようとしましたが、動作しません。 Yiiはのように見えます。 setter/getterを呼び出して、その属性がテーブルに存在するかどうかを確認してください。属性が存在する場合、yiiはそれを設定し、setterは呼び出されません。

ありがとうございます。

UPDATE:私はすでにシステムで$ model-> attribXを多用していますが、今は$ model-> attribXが変更されたためにいくつかの '連鎖'更新をトリガーするように実装する必要があります。 '$ model-> attribX'のすべてを '$ model-> changeAttribX(...)'のように変更する必要はありません。

答えて

0

あなたの質問から得られるものは、「フィールドがデータベースに保存される前にいくつかのことをしたい」ということです。それが問題であれば、beforeSave()メソッドをオーバーライドすることができます。

public function beforeSave() { 
    if (count($this->name) > 100) 
     echo "how come your name is so big?"; 

    return parent::beforeSave(); 
} 
2

CActiveRecord__get__setのYiiのの実装は1 CComponentで「標準」とは異なります。後者は、ゲッターとセッターをプロパティのためにチェックし(使用するのを好みます)、前者はこれをまったく行いません。

あなたの質問に直接答えるには、上記のtwoimplementationsを持つ独自のクラスにこの機能を組み込む必要があります。ややセッターのためのこのような:

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; 
} 

この実装は、またはあなたが望むものであってもなくてもよい裸の性質、オーバーゲッターとセッターに優先します。 CActiveRecordをこのようにサブクラス化した後、サブクラスから独自のモデルを派生させます。

重要な考慮事項:すべて同じですが、この機能を使用して達成したいことは言わず、これは疑問を提起します。たとえば、通常このような機能は値の検証に使用されますが、Yiiは独自の検証システムを備えています。 あなたが望むことをやっている方がより良い(より多くの似たような)方法がある可能性があります。

+0

ありがとうございました。私はこれを慎重に確認します。それは私の問題を解決するようです。理由については、私は質問を更新しました。 – slinstj

関連する問題