Est-il possible de passer outre les propriétés du modèle sans les définir à nouveau avec tous Kohana?
-
27-09-2019 - |
Question
Je suit, par exemple:
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),
),
);
}
Ici, Model_UserAdmin
étend Model_User
et remplace la longueur maximale de mot de passe et supprime la validation pour password_confirm
(ce n'est pas un cas réel, mais un exemple).
Y at-il une meilleure façon au lieu de redéfinir l'ensemble de propriété $_rules
/ tableau?
La solution
Utilisez _initialize()
au lieu de __construct($id)
si vous souhaitez enregistrer votre modèle UserAdmin en session (comme le module Auth fait). objets ORM sérialisé ne remettront pas __construct()
, de sorte qu'une partie de vos règles perdu. _initialize()
valeurs par défaut des jeux de méthode pour les propriétés du modèle comme nom_table, relations etc
protected function _initialize()
{
// redefine model rules
$this->_rules['password']['max_length'] = 42 ;
unset($this->_rules['password_confirm']) ;
// call parent method
parent::_initialize();
}
Autres conseils
vous pouvez probablement écraser ou ajouter dans le constructeur de l'enfant les éléments du tableau à $this->_rules
, car il existe déjà dès que vous créez une instance de Model_UserAdmin
.
Plus précisément, dans Model_UserAdmin
ne définissent pas un protected $rules
il qu'elle reçoit de ses parents, puis dans le constructeur:
$this->_rules['password']['max_length'] = 42 ;
unset($this->_rules['password_confirm']) ;
Vous pouvez également ajouter un peu de bon sens contrôle juste avant de faire en sorte que ces clés existent, dans le cas où vous les modifiez en Model_User
et oublier.
Il est pas exactement élégant mais il devrait fonctionner. Je suppose que vous pouvez créer des fonctions autour (probablement dans un class ORM extends ORM_Core
ils sont disponibles lorsque vous étendez ORM) qui modifient les règles d'une manière plus formelle.
modifier s'il vous plaît consulter la réponse de biakaveron pour une astuce sur où placer les règles de l'enfant (au lieu _initialize()
du constructeur)