2010-10-04 86 views
1

我有以下,例如:有没有一种方法来重写模型属性,而不用Kohana再次定义它们?

class Model_User extends ORM { 
    protected $_rules = array(
     'username' => array(
      'not_empty' => NULL, 
      'min_length' => array(6), 
      'max_length' => array(250), 
      'regex'  => array('/^[-\pL\[email protected]]++$/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\[email protected]]++$/uD'), 
     ), 
     'password' => array(
      'not_empty' => NULL, 
      'min_length' => array(5), 
      'max_length' => array(42), 
     ), 
    ); 
} 

在这里,Model_UserAdmin延伸Model_User并覆盖最大长度为密码并删除password_confirm验证(这不是一个实际的情况下,但一个例子)。

有没有更好的方法,而不是重新定义整个$_rules属性/数组?

回答

4

使用_initialize(),而不是如果你要存储UserAdmin模型会议__construct($id)(如验证模块确实)。序列化的ORM对象不会调用__construct(),因此部分规则将丢失。 _initialize()方法对于像table_name的,关系等

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

在孩子的构造函数中,您可能会覆盖或添加数组元素到$this->_rules,因为只要您创建Model_UserAdmin实例,它就已经存在。

具体而言,在Model_UserAdmin没有定义protected $rules所以它得到它从其父,然后在构造函数:

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

您也可以直接前加一些仔细的检查,以确保存在这些键,如果你改变他们在Model_User并忘记。

它不完全优雅,但它应该工作。我想你可以在它周围创建一些包装函数(可能在class ORM extends ORM_Core中,以便它们在扩展ORM时可用),以更正式的方式修改规则。

编辑请看看biakaveron的答案在哪里放置孩子规则小费(_initialize()而非构造函数)

+0

我想这将是这样:(希望的Kohana有东西给本已模特属性设置默认值。 – 2010-10-04 22:10:48

相关问题