Est-il possible de passer outre les propriétés du modèle sans les définir à nouveau avec tous Kohana?

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

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?

Était-ce utile?

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)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top