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 函数现在也有类似的问题。
我想知道的:
- 这种类型的赋值是不是一开始就没有打算过(而且我只是没有找到启用它的以前开发人员的代码)?我浏览了 Yii2 更新日志,但没有注意到任何相关内容。
- 有没有办法 "salvage" 以前的行为,这样我就不必用我的解决方法函数替换每次出现的事件?
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 中的源代码进行比较 - 您可能会发现更多核心被编辑的地方。
我继承了一个用 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 更新日志,但没有注意到任何相关内容。
- 有没有办法 "salvage" 以前的行为,这样我就不必用我的解决方法函数替换每次出现的事件?
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 中的源代码进行比较 - 您可能会发现更多核心被编辑的地方。