Yii2 $model->_attributes 分配在新版本中不起作用

Yii2 $model->_attributes assignment does not work in new version

我继承了一个用 Yii2 创建的项目,ver. 2.0.4,由于旧版本与 PHP 7.2+.

不兼容,因此任务是将所述项目更新为 Yii2 (2.0.15) 的最新版本

我注意到将数组分配给模型有很多用途:

$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];
    }
}

此外,getter 函数现在也有类似的问题。

我想知道的:

ActiveRecord::$_attributes 始终是私有的,绝不能以这种方式使用。我猜想以前的开发人员在 vendor 目录中编辑了框架核心文件,并将其设为 属性 protected/public。

您可以尝试通过使用 getter 和 setter 创建虚拟属性来模拟此行为:

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

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

但这并不总是有效,它更像是一种丑陋的技巧,可以让蹩脚的代码正常工作。我强烈建议修复代码以使用 setAttributes() 而不是 _attributes

您还应该将 vendor 目录中的 yii2 包与 https://github.com/yiisoft/yii2-framework/releases/tag/2.0.4 中的源代码进行比较 - 您可能会发现更多核心被编辑的地方。