1

例如,我有以下内容:

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属性/数组?

4

2 回答 2

4

如果您想将 UserAdmin 模型存储在会话中(就像 Auth 模块一样),请使用_initialize()而不是。__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();
}
于 2010-10-05T09:21:47.447 回答
2

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

具体来说,在Model_UserAdmin不定义 aprotected $rules所以它从其父级获取它,然后在构造函数中:

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

您还可以在之前添加一些完整性检查以确保这些密钥存在,以防您更改它们Model_User并忘记它们。

它并不完全优雅,但它应该可以工作。我确实认为您可以围绕它创建一些包装函数(可能在class ORM extends ORM_Core扩展 ORM 时它们可用),以更正式的方式修改规则。

编辑请查看 biakaveron 的答案以获取有关在何处放置子规则(_initialize()而不是构造函数)的提示

于 2010-10-04T21:55:14.343 回答