Переопределение сеттера и подчеркивание

Обсуждение документации второй версии фреймворка. Переводы Cookbook и авторские рецепты.
Ответить
sm-vasya
Сообщения: 191
Зарегистрирован: 2015.03.04, 01:12

Переопределение сеттера и подчеркивание

Сообщение sm-vasya »

Друзья, здрасте

у меня в базе у таблицы есть поля 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) ?

спасибо

извиняюсь, если не в той ветке вопрос задал
maxmirazh33
Сообщения: 45
Зарегистрирован: 2013.04.05, 09:49
Откуда: Омск

Re: Переопределение сеттера и подчеркивание

Сообщение maxmirazh33 »

Сеттер вызывается тогда, когда не существует свойства. При вызове $model->doc_id изначально будет искаться свойство с названием doc_id (а оно, как Вы говорите, есть). Что мешает напрямую вызывать $model->setDocId($value)?
Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: Переопределение сеттера и подчеркивание

Сообщение Onotole »

А что мешает в beforeSave переопределить свойство?
sm-vasya
Сообщения: 191
Зарегистрирован: 2015.03.04, 01:12

Re: Переопределение сеттера и подчеркивание

Сообщение sm-vasya »

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;
}
...
а он не вызывается

может я чтото не понимаю в ООП, или в архитектуре цепочки классов, но хотелось бы переопределить именно сеттер именно для этого "виртуального" свойства, поскольку в моем понимание в этом красота ООП и магии
Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: Переопределение сеттера и подчеркивание

Сообщение Onotole »

Если свойство есть, то сеттер не сработает. А свойство у вас есть. Для переопределения свойств можно переопределить метод afterFind(), и в нем для необходимого свойства определить необходимое значение
sm-vasya
Сообщения: 191
Зарегистрирован: 2015.03.04, 01:12

Re: Переопределение сеттера и подчеркивание

Сообщение sm-vasya »

Onotole писал(а):Если свойство есть, то сеттер не сработает. А свойство у вас есть. Для переопределения свойств можно переопределить метод afterFind(), и в нем для необходимого свойства определить необходимое значение
да, точно. в BaseActiveRecord переопределили родительский __set

Код: Выделить всё

public function __set($name, $value)
    {
        if ($this->hasAttribute($name)) {
            $this->_attributes[$name] = $value;
        } else {
            parent::__set($name, $value);
        }
    }
 
тем самым удалив всю магию

спасибо за участие
Ответить