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

时间:2018-11-19 17:02:01

标签: php yii2 getter-setter

我继承了一个使用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函数现在也有类似的问题。

我想知道的事情:

  • 这种类型的分配从一开始就没有打算(而我只是没有找到启用该分配的先前开发人员的代码)?我浏览了Yii2更新日志,但没有发现任何相关信息。
  • 是否有办法“挽救”以前的行为,因此我不必用应急方案功能替换每次发生的情况?

1 个答案:

答案 0 :(得分:3)

ActiveRecord::$_attributes始终是私有的,永远不要以这种方式使用。我猜想以前的开发人员在vendor目录中编辑了框架核心文件,并使该属性受保护/公开。

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

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

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

但这并不总是可行,它更像是使糟糕的代码正常工作的丑陋的hack。我强烈建议修复代码以使用setAttributes()而不是_attributes

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