我有以下内容,例如:
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
属性/数组?
答案 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()
而不是构造函数)