Yii2:自定义 setter method/data 转换在 ActiveRecord 上不起作用?
Yii2: custom setter method/data transformation doesn't work on ActiveRecord?
我正在尝试对名为 usr_firstname
.
的属性使用 setter 方法 setUsr_firstname
对属性进行数据转换
class User extends ActiveRecord implements IdentityInterface {
public function rules() {
return [
[['usr_firstname', 'usr_lastname', ... ], 'required'],
...
];
}
...
public function setUsr_firstname($value) {
$this->usr_firstname = fix_wrong_title_case($value);
}
}
然后我执行以下操作:
$model = new User(['scenario' => User::SCENARIO_REGISTER]);
$model->usr_firstname = 'John';
但是 setter 方法从未被调用过!我试过命名各种事物的方法 - 例如。 setUsrFirstname
- 但没有任何效果。我如何让它工作?
更新
发现它不适用于任何 ActiveRecord 属性,属性名称中有或没有下划线。
Setter 对于直接声明的属性或 Active Record 属性(无论是否带下划线),都不会调用方法。
Active Record 的神奇 __set
方法将值直接分配给映射的属性。
您可以使用新的虚拟属性实现类似的功能:
public function setUsrFirstname($value)
{
$this->usr_firstname = doSomethingWith($value);
}
public function getUsrFirstname()
{
return $this->usr_firstname;
}
现在您可以像这样使用它了:
$this->usrFirstname = 'John';
echo $this->usrFirstname;
如果你想修改AR生命周期中的属性可以:
- 在验证期间使用 FilterValidator 更改它,
- 覆盖模型的
afterFind()
方法以在数据库提取后更改它,
- 覆盖模型的
beforeSave()
方法以在保存到数据库之前更改它,
- 准备可以完成上述所有事情的行为,
- 准备直接调用的方法来改变它(你可以使用第一个setter方法;不需要调用
validate()
和clearErrors()
)。
我正在尝试对名为 usr_firstname
.
setUsr_firstname
对属性进行数据转换
class User extends ActiveRecord implements IdentityInterface {
public function rules() {
return [
[['usr_firstname', 'usr_lastname', ... ], 'required'],
...
];
}
...
public function setUsr_firstname($value) {
$this->usr_firstname = fix_wrong_title_case($value);
}
}
然后我执行以下操作:
$model = new User(['scenario' => User::SCENARIO_REGISTER]);
$model->usr_firstname = 'John';
但是 setter 方法从未被调用过!我试过命名各种事物的方法 - 例如。 setUsrFirstname
- 但没有任何效果。我如何让它工作?
更新
发现它不适用于任何 ActiveRecord 属性,属性名称中有或没有下划线。
Setter 对于直接声明的属性或 Active Record 属性(无论是否带下划线),都不会调用方法。
Active Record 的神奇 __set
方法将值直接分配给映射的属性。
您可以使用新的虚拟属性实现类似的功能:
public function setUsrFirstname($value)
{
$this->usr_firstname = doSomethingWith($value);
}
public function getUsrFirstname()
{
return $this->usr_firstname;
}
现在您可以像这样使用它了:
$this->usrFirstname = 'John';
echo $this->usrFirstname;
如果你想修改AR生命周期中的属性可以:
- 在验证期间使用 FilterValidator 更改它,
- 覆盖模型的
afterFind()
方法以在数据库提取后更改它, - 覆盖模型的
beforeSave()
方法以在保存到数据库之前更改它, - 准备可以完成上述所有事情的行为,
- 准备直接调用的方法来改变它(你可以使用第一个setter方法;不需要调用
validate()
和clearErrors()
)。