我有以下,例如:

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属性/阵列的?

有帮助吗?

解决方案

使用_initialize()代替__construct($id)如果你要存储在会话你UserAdmin模型(如身份验证模块一样)。序列化对象ORM不会叫__construct(),所以你的规则的一部分就会丢失。像表名模特属性_initialize()方法集的默认值,关系等

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

其他提示

在孩子的构造函数你也许可以覆盖或只要你创建一个$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()而非构造函数)一个提示

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top