Друзья, здрасте
у меня в базе у таблицы есть поля doc_id, status_id
в модели соответственно есть вир. свойства doc_id, status_id
я хочу переопределить сеттер для свойства doc_id, чтобы так же устанавливалось status_id,
public function setDoc_Id($value)
{
$this->status_id = $value * 2 + 1;
}
но сеттер не вызывается если я пишу $model->doc_id = 3;
пробовал сеттер называть setDocId - не помогает
но стоит мне назвать сеттер setDocId и писать $model->docid = 3; - все работает. но мне не нравится этот способ.
подскажите как быть? и как в теле сеттера правильно будет произвести само присваивание, setAttribute('doc_id', $value) ?
спасибо
извиняюсь, если не в той ветке вопрос задал
Переопределение сеттера и подчеркивание
-
- Сообщения: 45
- Зарегистрирован: 2013.04.05, 09:49
- Откуда: Омск
Re: Переопределение сеттера и подчеркивание
Сеттер вызывается тогда, когда не существует свойства. При вызове $model->doc_id изначально будет искаться свойство с названием doc_id (а оно, как Вы говорите, есть). Что мешает напрямую вызывать $model->setDocId($value)?
Re: Переопределение сеттера и подчеркивание
А что мешает в beforeSave переопределить свойство?
Re: Переопределение сеттера и подчеркивание
оно есть в виртуальном определении,maxmirazh33 писал(а):Сеттер вызывается тогда, когда не существует свойства. При вызове $model->doc_id изначально будет искаться свойство с названием doc_id (а оно, как Вы говорите, есть). Что мешает напрямую вызывать $model->setDocId($value)?
/*
* @property integer $doc_id
*/
в самом классе модели его нет, класс потомок extends \yii\db\ActiveRecord
поэтому как мне кажется для этого свойства будет вызываться все равно магическая функция __set родителя yiisoft\yii2\base\Component:
....
public function __set($name, $value)
{
$setter = 'set' . $name;
if (method_exists($this, $setter)) {
// set property
$this->$setter($value);
return;
}
...
а он не вызывается
может я чтото не понимаю в ООП, или в архитектуре цепочки классов, но хотелось бы переопределить именно сеттер именно для этого "виртуального" свойства, поскольку в моем понимание в этом красота ООП и магии
Re: Переопределение сеттера и подчеркивание
Если свойство есть, то сеттер не сработает. А свойство у вас есть. Для переопределения свойств можно переопределить метод afterFind(), и в нем для необходимого свойства определить необходимое значение
Re: Переопределение сеттера и подчеркивание
да, точно. в BaseActiveRecord переопределили родительский __setOnotole писал(а):Если свойство есть, то сеттер не сработает. А свойство у вас есть. Для переопределения свойств можно переопределить метод afterFind(), и в нем для необходимого свойства определить необходимое значение
Код: Выделить всё
public function __set($name, $value)
{
if ($this->hasAttribute($name)) {
$this->_attributes[$name] = $value;
} else {
parent::__set($name, $value);
}
}
спасибо за участие