2012-03-28 3 views
1

Beispiel ...Gibt es eine Möglichkeit, Tabellenfelder in Yii-Modellen zu schützen, um Getter/Setter im Modell zu erzwingen?

Person - Felder der Tabelle:

  • id_person
  • Name

Nun nehmen wir an, ich das Modell $ Person in meinem Code. Ich würde gerne, dass jedes Mal hieß $person->name='TheName' Yii rief die meine benutzerdefinierte Funktion $person->setName('TheName'), Durchsetzung der Setter.

Gibt es eine Möglichkeit, das zu erreichen?

Ich habe versucht, die Attribute des Modells geschützt/privat, aber es funktioniert nicht. Yii scheint nur, um den Setter/Getter AFTER aufzurufen, um zu überprüfen, ob das Attribut in der Tabelle vorhanden ist. Wenn das Attribut existiert, yii setze es und es wird kein Setter aufgerufen.

Vielen Dank im Voraus.

UPDATE: Der Grund ist, dass ich schon so viel von $ model-> attribX in einem System verwende, aber jetzt muss ich irgendwie implementieren, um einige 'verkettete' Updates auszulösen, abhängig von $ model-> attribX ist geändert und ich möchte nicht alle '$ model-> attribX' durch etwas wie '$ model-> changeAttribX (...)' ändern;

Antwort

0

Was ich von Ihrer Frage bekomme, ist - "Ich möchte etwas tun, bevor das Feld in der Datenbank gespeichert wird". Wenn das die Frage ist, können Sie die beforeSave() -Methode überschreiben.

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

    return parent::beforeSave(); 
} 
2

Yü-Implementierung von __get und __set in CActiveRecord ist anders als der "Standard" ein in CComponent; letzterer prüft (und bevorzugt) einen Getter und einen Setter für das Grundstück, während ersteres dies überhaupt nicht tut.

Um Ihre Frage direkt zu beantworten: Sie müssten diese Funktionalität in Ihre eigene Klasse mit dem oben erwähnten twoimplementations als Leitfaden, z. etwas wie dies für den Setzer:

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

Diese Implementierung Vorrang Getter und Setter über nackte Eigenschaften gibt, die möglicherweise nicht sein, was Sie wollen. Nach der Unterklasse CActiveRecord würden Sie Ihre eigenen Modelle aus der Unterklasse ableiten.

Wichtiger Hinweis: Trotzdem sagen Sie nicht, was Sie mit dieser Funktionalität erreichen wollen und das wirft Fragen auf. Zum Beispiel werden normalerweise Funktionen wie diese verwendet, um Werte zu validieren, aber Yii verfügt über ein eigenes Validierungssystem. Es ist möglich, dass es eine bessere (mehr Yii-ähnliche) Art gibt, das zu tun, was Sie wollen.

+0

Danke Jon. Ich werde das sorgfältig prüfen. Es scheint mein Problem zu lösen. Über den Grund habe ich die Frage aktualisiert. – slinstj

Verwandte Themen