Yii2:自定义setter方法/数据转换在ActiveRecord上不起作用?

The*_*der 2 php activerecord yii2 yii2-model

我正在尝试通过setUsr_firstname对名为的属性使用setter方法对属性进行数据转换usr_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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我做以下事情:

$model = new User(['scenario' => User::SCENARIO_REGISTER]);
$model->usr_firstname = 'John';
Run Code Online (Sandbox Code Playgroud)

但是从不调用setter方法!我试过将方法命名为各种各样的东西 - 例如.setUsrFirstname - 但没有任何作用.我如何让它工作?

UPDATE

弄清楚它不适用于任何ActiveRecord属性,在属性名称中有或没有下划线.

Biz*_*ley 6

如果直接声明属性或Active Record属性(无论是否使用下划线),都不会调用Setter方法.

Active Record的魔术__set方法直接将值分配给映射的属性.

您可以使用新的虚拟属性实现类似的功能:

public function setUsrFirstname($value)
{
    $this->usr_firstname = doSomethingWith($value);
}

public function getUsrFirstname()
{
    return $this->usr_firstname;
}
Run Code Online (Sandbox Code Playgroud)

所以现在你可以使用它:

$this->usrFirstname = 'John';
echo $this->usrFirstname;
Run Code Online (Sandbox Code Playgroud)

如果要在AR的生命周期中修改属性,您可以:

  • 使用FilterValidator在验证期间更改它,
  • 覆盖模型afterFind()在DB提取后更改它的方法,
  • 覆盖模型beforeSave()在保存到DB之前更改它的方法,
  • 准备可以完成上述所有事情的行为,
  • 准备直接调用的方法将改变它(你可以使用第一个setter方法;不需要调用validate()clearErrors()).