2010-10-04 25 views
1

Je donne les résultats suivants, par exemple:Existe-t-il un moyen de remplacer les propriétés du modèle sans les définir à nouveau avec Kohana?

class Model_User extends ORM { 
    protected $_rules = array(
     'username' => array(
      'not_empty' => NULL, 
      'min_length' => array(6), 
      'max_length' => array(250), 
      'regex'  => array('/^[-\pL\[email protected]]++$/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\[email protected]]++$/uD'), 
     ), 
     'password' => array(
      'not_empty' => NULL, 
      'min_length' => array(5), 
      'max_length' => array(42), 
     ), 
    ); 
} 

Ici, Model_UserAdmin étend Model_User et la longueur maximum l'emporte sur le mot de passe et supprime la validation pour password_confirm (ce n'est pas un cas réel, mais un exemple).

Existe-t-il un meilleur moyen de redéfinir l'ensemble de la propriété/matrice $_rules?

Répondre

4

Utilisation _initialize() au lieu de __construct($id) si vous souhaitez enregistrer votre modèle UserAdmin en session (comme Le module d'authentification fait). Les objets ORM sérialisés n'appellent pas __construct(), donc une partie de vos règles sera perdue. _initialize() méthode définit les valeurs par défaut pour les propriétés de 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(); 
} 
2

Dans le constructeur de l'enfant, vous pouvez probablement remplacer ou ajouter des éléments de tableau à $this->_rules, car il existera déjà dès que vous créez une instance Model_UserAdmin.

Plus précisément, dans Model_UserAdmin ne définissent pas un protected $rules il obtient de son parent, puis dans le constructeur:

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

Vous pouvez également ajouter une vérification de bon sens juste avant de faire en sorte que ces clés existent , au cas où vous les changez en Model_User et oubliez.

Ce n'est pas exactement élégant mais ça devrait marcher. Je suppose que vous pouvez créer des fonctions wrapper autour d'elle (probablement dans un class ORM extends ORM_Core afin qu'ils soient 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 (_initialize() au lieu du constructeur)

+0

Je pensais que ce serait la façon :(Espérait Kohana avait quelque chose pour déjà. –