有没有办法覆盖模型属性而不用Kohana再次定义它们?

时间:2010-10-04 21:13:09

标签: php kohana kohana-3 kohana-orm

我有以下内容,例如:

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

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

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

2 个答案:

答案 0 :(得分:4)

如果要将UserAdmin模型存储在会话中(如Auth模块那样),请使用_initialize()代替__construct($id)。序列化的ORM对象不会调用__construct(),因此您的部分规则将丢失。 _initialize()方法为模型属性设置默认值,如table_name,relationship etc.

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

答案 1 :(得分: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()而不是构造函数)