Gibt es eine Möglichkeit Modelleigenschaften außer Kraft zu setzen, ohne sie alle wieder mit Kohana definieren?
-
27-09-2019 - |
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?
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)