Yii2 $model->_attributes assignment does not work in new version
up vote
1
down vote
favorite
I inherited a project that was created with Yii2, ver. 2.0.4, with the task to update said project to a more current version of Yii2 (2.0.15) because of the incompatibility of the older one with PHP 7.2+.
I noticed that there is a lot of use of assigning arrays to a model:
$model->_attributes = $array;
With the new version this results in an exception
'yiibaseUnknownPropertyException' with message 'Setting unknown property: appmodelsmodel::_attributes'
For the time being I created a workaround with the following function:
function customSetAttributes(&$model, $array) {
foreach($model->attributeLabels() as $model_key => $model_label) {
if(!isset($array[$model_key])) continue;
$model->$model_key = $array[$model_key];
}
}
Also, the getter function now has a similar issue.
What I would like to know:
- Was this type of assignment never intended in the first place (and I just haven't found the previous developer's code that enables it)? I skimmed over the Yii2 changelog but didn't notice anything related.
- Is there a way to "salvage" the previous behaviour so I don't have to replace each occurence with my workaround function?
php yii2 getter-setter
add a comment |
up vote
1
down vote
favorite
I inherited a project that was created with Yii2, ver. 2.0.4, with the task to update said project to a more current version of Yii2 (2.0.15) because of the incompatibility of the older one with PHP 7.2+.
I noticed that there is a lot of use of assigning arrays to a model:
$model->_attributes = $array;
With the new version this results in an exception
'yiibaseUnknownPropertyException' with message 'Setting unknown property: appmodelsmodel::_attributes'
For the time being I created a workaround with the following function:
function customSetAttributes(&$model, $array) {
foreach($model->attributeLabels() as $model_key => $model_label) {
if(!isset($array[$model_key])) continue;
$model->$model_key = $array[$model_key];
}
}
Also, the getter function now has a similar issue.
What I would like to know:
- Was this type of assignment never intended in the first place (and I just haven't found the previous developer's code that enables it)? I skimmed over the Yii2 changelog but didn't notice anything related.
- Is there a way to "salvage" the previous behaviour so I don't have to replace each occurence with my workaround function?
php yii2 getter-setter
this was never used like above even in the version you specified are those actualcontrollers
under theapp/controllers
directory
– Muhammad Omer Aslam
Nov 19 at 18:02
add a comment |
up vote
1
down vote
favorite
up vote
1
down vote
favorite
I inherited a project that was created with Yii2, ver. 2.0.4, with the task to update said project to a more current version of Yii2 (2.0.15) because of the incompatibility of the older one with PHP 7.2+.
I noticed that there is a lot of use of assigning arrays to a model:
$model->_attributes = $array;
With the new version this results in an exception
'yiibaseUnknownPropertyException' with message 'Setting unknown property: appmodelsmodel::_attributes'
For the time being I created a workaround with the following function:
function customSetAttributes(&$model, $array) {
foreach($model->attributeLabels() as $model_key => $model_label) {
if(!isset($array[$model_key])) continue;
$model->$model_key = $array[$model_key];
}
}
Also, the getter function now has a similar issue.
What I would like to know:
- Was this type of assignment never intended in the first place (and I just haven't found the previous developer's code that enables it)? I skimmed over the Yii2 changelog but didn't notice anything related.
- Is there a way to "salvage" the previous behaviour so I don't have to replace each occurence with my workaround function?
php yii2 getter-setter
I inherited a project that was created with Yii2, ver. 2.0.4, with the task to update said project to a more current version of Yii2 (2.0.15) because of the incompatibility of the older one with PHP 7.2+.
I noticed that there is a lot of use of assigning arrays to a model:
$model->_attributes = $array;
With the new version this results in an exception
'yiibaseUnknownPropertyException' with message 'Setting unknown property: appmodelsmodel::_attributes'
For the time being I created a workaround with the following function:
function customSetAttributes(&$model, $array) {
foreach($model->attributeLabels() as $model_key => $model_label) {
if(!isset($array[$model_key])) continue;
$model->$model_key = $array[$model_key];
}
}
Also, the getter function now has a similar issue.
What I would like to know:
- Was this type of assignment never intended in the first place (and I just haven't found the previous developer's code that enables it)? I skimmed over the Yii2 changelog but didn't notice anything related.
- Is there a way to "salvage" the previous behaviour so I don't have to replace each occurence with my workaround function?
php yii2 getter-setter
php yii2 getter-setter
asked Nov 19 at 17:02
arkxl
83
83
this was never used like above even in the version you specified are those actualcontrollers
under theapp/controllers
directory
– Muhammad Omer Aslam
Nov 19 at 18:02
add a comment |
this was never used like above even in the version you specified are those actualcontrollers
under theapp/controllers
directory
– Muhammad Omer Aslam
Nov 19 at 18:02
this was never used like above even in the version you specified are those actual
controllers
under the app/controllers
directory– Muhammad Omer Aslam
Nov 19 at 18:02
this was never used like above even in the version you specified are those actual
controllers
under the app/controllers
directory– Muhammad Omer Aslam
Nov 19 at 18:02
add a comment |
1 Answer
1
active
oldest
votes
up vote
3
down vote
accepted
ActiveRecord::$_attributes
was always private and never should be used in this way. I guess that previous developer edited framework core files in vendor
directory and make this property protected/public.
You may try to emulate this behavior by creating virtual attribute using getter and setter:
public function get_attributes() {
return $this->getAttributes();
}
public function set_attributes($values) {
$this->setAttributes($values, false);
}
But this will not always work and it is more like an ugly hack to make crappy code work. I strongly suggest to fix code to use setAttributes()
instead of _attributes
.
Also you should compare yii2
package from vendor
directory with source from https://github.com/yiisoft/yii2-framework/releases/tag/2.0.4 - you may find more places where core was edited.
1
Thanks, so far I got by using setAttributes() and getAttributes().
– arkxl
Nov 21 at 9:01
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
3
down vote
accepted
ActiveRecord::$_attributes
was always private and never should be used in this way. I guess that previous developer edited framework core files in vendor
directory and make this property protected/public.
You may try to emulate this behavior by creating virtual attribute using getter and setter:
public function get_attributes() {
return $this->getAttributes();
}
public function set_attributes($values) {
$this->setAttributes($values, false);
}
But this will not always work and it is more like an ugly hack to make crappy code work. I strongly suggest to fix code to use setAttributes()
instead of _attributes
.
Also you should compare yii2
package from vendor
directory with source from https://github.com/yiisoft/yii2-framework/releases/tag/2.0.4 - you may find more places where core was edited.
1
Thanks, so far I got by using setAttributes() and getAttributes().
– arkxl
Nov 21 at 9:01
add a comment |
up vote
3
down vote
accepted
ActiveRecord::$_attributes
was always private and never should be used in this way. I guess that previous developer edited framework core files in vendor
directory and make this property protected/public.
You may try to emulate this behavior by creating virtual attribute using getter and setter:
public function get_attributes() {
return $this->getAttributes();
}
public function set_attributes($values) {
$this->setAttributes($values, false);
}
But this will not always work and it is more like an ugly hack to make crappy code work. I strongly suggest to fix code to use setAttributes()
instead of _attributes
.
Also you should compare yii2
package from vendor
directory with source from https://github.com/yiisoft/yii2-framework/releases/tag/2.0.4 - you may find more places where core was edited.
1
Thanks, so far I got by using setAttributes() and getAttributes().
– arkxl
Nov 21 at 9:01
add a comment |
up vote
3
down vote
accepted
up vote
3
down vote
accepted
ActiveRecord::$_attributes
was always private and never should be used in this way. I guess that previous developer edited framework core files in vendor
directory and make this property protected/public.
You may try to emulate this behavior by creating virtual attribute using getter and setter:
public function get_attributes() {
return $this->getAttributes();
}
public function set_attributes($values) {
$this->setAttributes($values, false);
}
But this will not always work and it is more like an ugly hack to make crappy code work. I strongly suggest to fix code to use setAttributes()
instead of _attributes
.
Also you should compare yii2
package from vendor
directory with source from https://github.com/yiisoft/yii2-framework/releases/tag/2.0.4 - you may find more places where core was edited.
ActiveRecord::$_attributes
was always private and never should be used in this way. I guess that previous developer edited framework core files in vendor
directory and make this property protected/public.
You may try to emulate this behavior by creating virtual attribute using getter and setter:
public function get_attributes() {
return $this->getAttributes();
}
public function set_attributes($values) {
$this->setAttributes($values, false);
}
But this will not always work and it is more like an ugly hack to make crappy code work. I strongly suggest to fix code to use setAttributes()
instead of _attributes
.
Also you should compare yii2
package from vendor
directory with source from https://github.com/yiisoft/yii2-framework/releases/tag/2.0.4 - you may find more places where core was edited.
answered Nov 19 at 17:51
rob006
8,7833932
8,7833932
1
Thanks, so far I got by using setAttributes() and getAttributes().
– arkxl
Nov 21 at 9:01
add a comment |
1
Thanks, so far I got by using setAttributes() and getAttributes().
– arkxl
Nov 21 at 9:01
1
1
Thanks, so far I got by using setAttributes() and getAttributes().
– arkxl
Nov 21 at 9:01
Thanks, so far I got by using setAttributes() and getAttributes().
– arkxl
Nov 21 at 9:01
add a comment |
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53379451%2fyii2-model-attributes-assignment-does-not-work-in-new-version%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
this was never used like above even in the version you specified are those actual
controllers
under theapp/controllers
directory– Muhammad Omer Aslam
Nov 19 at 18:02