Есть ли способ переопределить модели свойств, не определяя их все еще раз с Коханой?

StackOverflow https://stackoverflow.com/questions/3859155

Вопрос

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

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() Метод Устанавливает значения по умолчанию для свойств модели, такие как table_name, отношения и т. Д.

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), которые изменяют правила более официально.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top