在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] 举报,一经查实,本站将立刻删除。