¿Hay una manera de anular Características del modelo, sin definirlas todo de nuevo con Kohana?
-
27-09-2019 - |
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?
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)