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

时间:2016-10-20 16:18:52

标签: php activerecord yii2 yii2-model

我尝试使用setter方法setUsr_firstname对属性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);
    }
}

然后我执行以下操作:

$model = new User(['scenario' => User::SCENARIO_REGISTER]);
$model->usr_firstname = 'John';

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

更新

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

1 个答案:

答案 0 :(得分:6)

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

Active Record的魔术func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) 方法直接为映射属性赋值。

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

__set

所以现在你可以使用它:

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

public function getUsrFirstname()
{
    return $this->usr_firstname;
}

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

  • 在验证期间使用FilterValidator进行更改
  • 覆盖模型的$this->usrFirstname = 'John'; echo $this->usrFirstname; 方法,在数据库提取后更改它,
  • 覆盖模型的afterFind()方法,在保存到数据库之前对其进行更改,
  • 准备可以执行上述所有操作的行为,
  • 准备直接调用的方法,它会改变它(你可以使用第一个setter方法;不需要调用beforeSave()validate())。