微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 由于构造函数,Yii模型isNewRecord为false

在Yii ActiveRecord中,是否可以在模型构造函数中设置属性并且仍然使模型的isNewRecord属性保持为真?

我有一个模型构造函数来创建一个私有属性来保存PHPPass密码哈希实例.当我这样做时,它将isNewRecord属性设置为false,即使该记录是新建的.

如果id属性大于零,我尝试在构造函数调用setIsNewRecord(true),但是看起来属性在构造函数中不可用.

我不得不删除构造函数,并在每个需要PHPass的方法生成语句.

用户模型的构造函数

public function __construct(){
    $this->PHPass=new PasswordHash(Yii::app()->params['PHPass']['iteration_count_log2'], Yii::app()->params['PHPass']['portable_hashes']);
}

控制器中的用户模型init和isNewRecord条件

public function actionEdit($id = null)
{

    $myModel = new User();       
    echo $myModel->isNewRecord;   //false due to constructor
}

解决方法:

当ovveriding contstructor确保调用父构造函数时.除非你知道自己在做什么,否则总是在ovveriding时调用父构造函数.

public function __construct($scenario = 'insert'){
    parent::__construct($scenario);
    $this->PHPass=new PasswordHash(Yii::app()->params['PHPass']['iteration_count_log2'], Yii::app()->params['PHPass']['portable_hashes']);
}

PHPass也可以存储为静态属性,每个活动记录实例不需要新的PHPass实例.

编辑:感谢@Kevin链接question关于ovverding构造函数.

添加的另一个重要注意事项:请记住将参数传递给构造函数.在Yii模型类中,存在具有认值insert的$scenario param.当你在没有传递这个参数的情况下使用构造函数时,将始终存在插入场景,并且不会有任何关于缺失参数的错误消息,因为它具有认值.我用$scenario更新了代码.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐