Existe uma maneira de substituir as propriedades do modelo sem definir todas elas novamente com Kohana?

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

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?

Foi útil?

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)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top