¿Hay una manera de anular Características del modelo, sin definirlas todo de nuevo con Kohana?

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

Pregunta

I tienen las siguientes, por ejemplo:

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

En aquí, Model_UserAdmin extiende Model_User y anula la longitud máxima para la contraseña y elimina la validación para password_confirm (esto no es un caso real, pero un ejemplo).

¿Hay una mejor manera en lugar de la redefinición de todo el edificio $_rules / matriz?

¿Fue útil?

Solución

Uso _initialize() en lugar de __construct($id) si desea almacenar su modelo UserAdmin en sesión (como el módulo de autenticación hace). ORM objetos serializados no llamarán __construct(), por lo que se pierde parte de sus reglas. valores conjuntos método predeterminado _initialize() para Características del modelo como nombre_tabla, relaciones, etc.

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

Otros consejos

En el constructor del niño probablemente pueda sobrescribir o añadir elementos de la matriz a $this->_rules, como ya existirá tan pronto como se crea una instancia Model_UserAdmin.

En concreto, en Model_UserAdmin no definen un protected $rules por lo que recibe de su matriz, y luego en el constructor:

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

También se puede añadir un poco de comprobación de validez justo antes de hacer seguro que existen esas llaves, en caso de que los cambie en Model_User y olvidar.

No es exactamente elegante pero debería funcionar. Yo supongo que se puede crear algunas funciones de contenedor alrededor de él (probablemente en un class ORM extends ORM_Core para que estén disponibles cuando extiende ORM) que modifican las reglas de una manera más formal.

editar Por favor, mire la respuesta de biakaveron para un consejo sobre dónde colocar las reglas niño (_initialize() en lugar del constructor)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top