我继承了一个使用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函数现在也有类似的问题。
我想知道的事情:
答案 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中的源代码进行比较-您可能会发现更多编辑核心的地方。