Есть ли способ сделать поля таблиц защищенными в моделях Yii, чтобы обеспечить использование метода получения / установки в модели? - PullRequest
1 голос
/ 28 марта 2012

Пример ...

Person - поля таблицы:

  • id_person
  • name

Теперь предположим, чтоВ моем коде есть модель $ person.Мне бы хотелось, чтобы каждый раз это называлось $person->name='TheName' Yii вызывал мою настроенную функцию $person->setName('TheName'), обеспечивающую работу установщика.

Есть ли способ сделать это?

Я пытался сделать атрибуты модели защищенными / закрытыми, но это не работает.Yii кажется только для вызова метода установки / получения ПОСЛЕ проверки, существует ли атрибут в таблице.Когда атрибут существует, yii устанавливает его, и не вызывается никакой установщик.

Заранее спасибо.

ОБНОВЛЕНИЕ: Причина в том, что я уже так много раз использую $ model-> attribX всистема, но теперь мне нужно как-то реализовать, чтобы запустить некоторое «цепочечное» обновление в зависимости от того, что $ model-> attribX изменено, и я не хочу менять все $ model-> attribX на что-то вроде $ model-> changeAttribX (..) ';

Ответы [ 2 ]

2 голосов
/ 28 марта 2012

Реализация Yii __get и __set в CActiveRecord отличается от "стандартной" в CComponent;последний проверяет (и предпочитает использовать) метод получения и установки свойства, в то время как первый не делает этого вообще.

Чтобы прямо ответить на ваш вопрос: вам необходимо встроить эту функцию в свойсобственный класс, имеющий две реализации , упомянутые выше в качестве руководства, например, что-то вроде этого для установщика:

public function setAttribute($name,$value)
{
    $setter='set'.$name;
    if(method_exists($this,$setter))
        $this->$setter($value);
    else if(property_exists($this,$name))
        $this->$name=$value;
    else if(isset($this->getMetaData()->columns[$name]))
        $this->_attributes[$name]=$value;
    else
        return false;

    return true;
}

Эта реализация дает приоритет получателям и установщикамголые свойства, которые могут или не могут быть тем, что вы хотите.После подкласса CActiveRecord, подобного этому, вы будете выводить свои собственные модели из подкласса.

Важное замечание: Тем не менее вы не говорите, чего хотите достичь, используя эту функциональностьэто вызывает вопросы.Например, обычно такие функции используются для проверки значений, но Yii имеет свою собственную систему проверки. Возможно, есть лучший (более похожий на Yii) способ сделать то, что вы хотите.

0 голосов
/ 28 марта 2012

Что я получил от вашего вопроса - «Я хочу кое-что сделать, прежде чем поле будет сохранено в базе данных». Если это вопрос, вы можете переопределить метод beforeSave ().

public function beforeSave() {
    if (count($this->name) > 100)
       echo "how come your name is so big?";

    return parent::beforeSave();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...