Gibt es eine Möglichkeit Modelleigenschaften außer Kraft zu setzen, ohne sie alle wieder mit Kohana definieren?

StackOverflow https://stackoverflow.com/questions/3859155

Frage

Ich habe folgende, zum Beispiel:

class Model_User extends ORM {
    protected $_rules = array(
        'username' => array(
            'not_empty'  => NULL,
            'min_length' => array(6),
            'max_length' => array(250),
            'regex'      => array('/^[-\pL\pN_@.]++$/uD'),
        ),
        'password' => array(
            'not_empty'  => NULL,
            'min_length' => array(5),
            'max_length' => array(30),
        ),
        'password_confirm' => array(
            'matches'    => array('password'),
        ),
    );
}

class Model_UserAdmin extends Model_User {
    protected $_rules = array(
        'username' => array(
            'not_empty'  => NULL,
            'min_length' => array(6),
            'max_length' => array(250),
            'regex'      => array('/^[-\pL\pN_@.]++$/uD'),
        ),
        'password' => array(
            'not_empty'  => NULL,
            'min_length' => array(5),
            'max_length' => array(42),
        ),
    ); 
}

Hier erstreckt sich Model_UserAdmin Model_User und überschreibt die maximale Länge für Passwort und entfernt die Validierung für password_confirm (dies ist kein konkreter Fall, sondern ein Beispiel).

Gibt es einen besseren Weg, anstatt die gesamte $_rules Eigenschaft / Array neu zu definieren?

War es hilfreich?

Lösung

Verwenden _initialize() statt __construct($id), wenn Sie in der Sitzung Ihre Admin Modell speichern möchten (wie Auth Modul der Fall ist). Serialisiert ORM Objekte __construct() nicht nennen, so dass ein Teil Ihrer Regeln verloren. _initialize() Methode setzt Standardwerte für die Modell-Eigenschaften wie table_name, Beziehungen etc

protected function _initialize()
{
   // redefine model rules
   $this->_rules['password']['max_length'] = 42 ;
   unset($this->_rules['password_confirm']) ;
   // call parent method
   parent::_initialize();
}

Andere Tipps

In dem Konstruktor des Kindes können Sie wahrscheinlich überschreiben oder Array-Elemente zu $this->_rules hinzufügen, da es bereits vorhanden sein wird, sobald Sie eine Model_UserAdmin Instanz erstellen.

Insbesondere in Model_UserAdmin definieren nicht eine protected $rules so es sie von ihren Eltern bekommt, und dann im Konstruktor:

$this->_rules['password']['max_length'] = 42 ;
unset($this->_rules['password_confirm']) ;

Sie können auch einige Plausibilitätsprüfung hinzufügen Recht vor, um sicherzustellen, diese Schlüssel vorhanden ist, falls Sie sie in Model_User ändern und vergessen.

Es ist nicht gerade elegant, aber es sollte funktionieren. Ich nehme an, Sie einige Wrapper-Funktionen um es schaffen kann (wahrscheinlich in einem class ORM extends ORM_Core so dass sie zur Verfügung, wenn Sie erweitern ORM), dass die Regeln in eine formelle Weise verändern.

Bearbeiten bitte Blick auf biakaveron Antwort für eine Spitze auf, wo das Kind Regeln zu setzen (_initialize() anstelle des Konstrukteurs)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top