Existe uma maneira de substituir as propriedades do modelo sem definir todas elas novamente com Kohana?
-
27-09-2019 - |
Pergunta
Eu tenho o seguinte, por exemplo:
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),
),
);
}
Aqui, Model_UserAdmin
estende -se Model_User
e substitui o comprimento máximo da senha e remove a validação para password_confirm
(Este não é um caso real, mas um exemplo).
Existe uma maneira melhor em vez de redefinir o inteiro $_rules
Propriedade/Array?
Solução
Usar _initialize()
ao invés de __construct($id)
Se você deseja armazenar seu modelo de userAdmin na sessão (como o módulo de autenticação). Objetos ORM serializados não ligarão __construct()
, então parte de suas regras será perdida. _initialize()
O método define valores padrão para propriedades do modelo como Table_name, Relacionamentos etc.
protected function _initialize()
{
// redefine model rules
$this->_rules['password']['max_length'] = 42 ;
unset($this->_rules['password_confirm']) ;
// call parent method
parent::_initialize();
}
Outras dicas
No construtor da criança, você provavelmente pode substituir ou adicionar elementos de matriz a $this->_rules
, como já existirá assim que você criar um Model_UserAdmin
instância.
Especificamente, em Model_UserAdmin
Não defina um protected $rules
Então, ele recebe de seus pais e, em seguida, no construtor:
$this->_rules['password']['max_length'] = 42 ;
unset($this->_rules['password_confirm']) ;
Você também pode adicionar alguma verificação de sanidade antes para garantir que essas chaves existam, caso você as mude em Model_User
e esquecer.
Não é exatamente elegante, mas deve funcionar. Eu acho que você pode criar algumas funções de wrapper em torno dele (provavelmente em um class ORM extends ORM_Core
Portanto, eles estão disponíveis quando você estende o ORM) que modificam as regras de uma maneira mais formal.
editar Por favor, veja a resposta de Biakaveron para obter uma dica sobre onde colocar as regras da criança (_initialize()
em vez do construtor)