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())。