gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:49:49 29 4
gpt4 key购买 nike

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

我有一个模型构造函数来创建一个私有(private)属性来保存 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']);
}

Controller 中的用户模型初始化和isNewRecord条件

public function actionEdit($id = null)
{

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

最佳答案

验证构造函数时确保调用父构造函数。 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 模型类中有 $scenario 参数,默认值为 insert。当你在不传递这个参数的情况下验证构造函数时,总会有 insert 的情况,并且不会有任何关于缺少参数的错误消息,因为它有默认值。我用 $scenario 更新了代码。

关于php - 由于构造函数,Yii 模型 isNewRecord false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16344540/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com