isnewrecord php,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更新了代码.

标签:php,activerecord,mysql,yii

来源: https://codeday.me/bug/20190725/1534624.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值