Yii2 $model->_attributes assignment does not work in new version
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 |
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 '18 at 18:02
add a comment |
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 '18 at 17:02
arkxlarkxl
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 '18 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 '18 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 '18 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 '18 at 18:02
add a comment |
1 Answer
1
active
oldest
votes
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 '18 at 9:01
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
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
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
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 '18 at 9:01
add a comment |
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 '18 at 9:01
add a comment |
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 '18 at 17:51
rob006rob006
9,51531032
9,51531032
1
Thanks, so far I got by using setAttributes() and getAttributes().
– arkxl
Nov 21 '18 at 9:01
add a comment |
1
Thanks, so far I got by using setAttributes() and getAttributes().
– arkxl
Nov 21 '18 at 9:01
1
1
Thanks, so far I got by using setAttributes() and getAttributes().
– arkxl
Nov 21 '18 at 9:01
Thanks, so far I got by using setAttributes() and getAttributes().
– arkxl
Nov 21 '18 at 9:01
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
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 '18 at 18:02