在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更新了代码.
标签:php,activerecord,mysql,yii
来源: https://codeday.me/bug/20190725/1534624.html