Есть ли способ переопределить модели свойств, не определяя их все еще раз с Коханой?
-
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()
Метод Устанавливает значения по умолчанию для свойств модели, такие как 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()
вместо конструктора)