【问题标题】:Is there a way to override Model properties without defining them all again with Kohana?有没有办法覆盖模型属性而不用 Kohana 再次定义它们?
【发布时间】:2010-10-04 21:13:09
【问题描述】:

我有以下,例如:

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

【问题讨论】:

    标签: php kohana kohana-3 kohana-orm


    【解决方案1】:

    如果您想将 UserAdmin 模型存储在会话中(就像 Auth 模块一样),请使用 _initialize() 而不是 __construct($id)。序列化的 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();
    }
    

    【讨论】:

      【解决方案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() 而不是构造函数)

      【讨论】:

      • 我在想这就是方法 :( 希望 Kohana 已经为此有所准备了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-12
      • 2014-08-04
      • 1970-01-01
      • 2021-04-10
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多