代码之家  ›  专栏  ›  技术社区  ›  Darryl Hein IrishChieftain

有没有一种方法可以覆盖模型属性,而不用再次用Kohana定义它们?

  •  1
  • Darryl Hein IrishChieftain  · 技术社区  · 15 年前

    例如,我有以下内容:

    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 回复  |  直到 15 年前
        1
  •  4
  •   biakaveron    15 年前

    使用 _initialize() 而不是 __construct($id) 如果您想在会话中存储您的useradmin模型(如auth模块)。序列化的ORM对象将不调用 __construct() ,所以您的部分规则将丢失。 “初始化”() 方法为模型属性(如表名、关系等)设置默认值

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

    在子构造函数中,您可能可以覆盖或添加数组元素到 $this->_rules ,因为一旦创建 Model_UserAdmin 实例。

    具体来说,在 Mulk模型 不要定义 protected $rules 因此,它从其父级获取它,然后在构造函数中:

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

    您还可以在前面添加一些健全性检查,以确保这些密钥存在,以防您在中更改它们。 Model_User 忘了。

    它不太雅致,但应该管用。我想您可以围绕它创建一些包装函数(可能在 class ORM extends ORM_Core 因此,当您扩展ORM时,它们是可用的,可以更正式地修改规则。

    编辑 请看比亚卡弗隆的答案,了解在哪里放置儿童规则的小贴士。( _initialize() 而不是构造函数)

    推荐文章