Domanda

Ho il seguente, per esempio:

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),
        ),
    ); 
}

In qui, Model_UserAdmin estende Model_User e sostituisce la lunghezza massima della password e rimuove la convalida per password_confirm (questo non è un caso reale, ma un esempio).

C'è un modo migliore, invece di ridefinire tutta la struttura $_rules / array?

È stato utile?

Soluzione

Usa _initialize() invece di __construct($id) se si desidera memorizzare il vostro modello UserAdmin in sessione (come modulo Auth fa). oggetti ORM serializzato non chiameranno __construct(), quindi una parte del tuo regole sarà perso. _initialize() valori metodo imposta predefiniti per proprietà modello come table_name, relazioni ecc

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

Altri suggerimenti

Nel costruttore del bambino si può probabilmente sovrascrittura o aggiungere elementi dell'array a $this->_rules, in quanto esiste già, non appena si crea un'istanza Model_UserAdmin.

In particolare, in Model_UserAdmin non si definisce un protected $rules in modo che ottiene dal suo genitore, e poi nel costruttore:

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

Si può anche aggiungere un po 'controllo di integrità a destra prima di rendere sicuri esistono quelle chiavi, nel caso in cui non vengono modificate in Model_User e dimenticare.

Non è esattamente elegante, ma dovrebbe funzionare. Io suppongo che è possibile creare alcune funzioni wrapper intorno ad esso (probabilmente in un class ORM extends ORM_Core in modo che siano disponibili quando si estende ORM) che modificano le regole in maniera più formale.

modifica Si prega di guardare la risposta di biakaveron per un suggerimento su dove collocare le regole figlie (_initialize() al posto del costruttore)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top