有没有办法不使用Kohana开发所有再次定义它们覆盖模型属性?
-
27-09-2019 - |
题
我有以下,例如:
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()
而非构造函数)一个提示
不隶属于 StackOverflow