Есть ли способ переопределить свойства модели, не определяя их снова с помощью Kohana? - PullRequest
1 голос
/ 05 октября 2010

У меня есть следующее, например:

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 ]

4 голосов
/ 05 октября 2010

Используйте _initialize() вместо __construct($id), если вы хотите сохранить свою модель UserAdmin в сеансе (как это делает модуль Auth). Сериализованные объекты 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 голосов
/ 05 октября 2010

В дочернем конструкторе вы, вероятно, можете перезаписать или добавить элементы массива в $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), которые изменяют правила более формальным способом.

edit Посмотрите, пожалуйста, ответ Biakaveron для подсказки, где разместить дочерние правила (_initialize() вместо конструктора)

...