Yii2 $ model -> _ назначение атрибутов не работает в новой версии - PullRequest
0 голосов
/ 19 ноября 2018

Я унаследовал проект, который был создан с Yii2, вер.2.0.4, с задачей обновить указанный проект до более новой версии Yii2 (2.0.15) из-за несовместимости более старой версии с PHP 7.2 +.

Я заметил, что есть многоиспользование присвоения массивов модели:

$model->_attributes = $array;

В новой версии это приводит к исключению

'yii\base\UnknownPropertyException' with message 'Setting unknown property: app\models\model::_attributes'

В настоящее время я создал обходной путь со следующей функцией:

function customSetAttributes(&$model, $array) {
    foreach($model->attributeLabels() as $model_key => $model_label) {
        if(!isset($array[$model_key])) continue;
        $model->$model_key = $array[$model_key];
    }
}

Кроме того, функция получения теперь имеет похожую проблему.

Что я хотел бы знать:

  • Был ли этот тип назначения никогда не предназначался в первомместо (а я просто не нашел предыдущий код разработчика, который это позволяет)?Я пролистал список изменений Yii2, но не заметил ничего связанного с ним.
  • Есть ли способ «спасти» предыдущее поведение, чтобы мне не приходилось заменять каждый случай моей обходной функцией?

1 Ответ

0 голосов
/ 19 ноября 2018

ActiveRecord::$_attributes всегда был приватным и никогда не должен использоваться таким образом. Я предполагаю, что предыдущий разработчик редактировал файлы ядра фреймворка в каталоге vendor и сделал это свойство защищенным / public.

Вы можете попытаться эмулировать это поведение, создав виртуальный атрибут, используя getter и setter:

public function get_attributes() {
    return $this->getAttributes();
}

public function set_attributes($values) {
    $this->setAttributes($values, false);
}

Но это не всегда будет работать, и это больше похоже на уродливый хак, чтобы заставить работать дерьмовый код. Я настоятельно рекомендую исправить код, чтобы использовать setAttributes() вместо _attributes.

Также вы должны сравнить yii2 пакет из каталога vendor с источником из https://github.com/yiisoft/yii2-framework/releases/tag/2.0.4 - вы можете найти больше мест, где редактировалось ядро.

...