Php 由于构造函数的原因,Yii模型isNewRecord为false
在Yii ActiveRecord中,是否可以在模型构造函数中设置一个属性,并且仍然保持模型的isNewRecord属性为true 我有一个模型构造函数来创建一个私有属性来保存PHPPass密码哈希实例。当我这样做时,它会将isNewRecord属性设置为false,即使记录是新创建的 如果id属性大于零,我尝试了在构造函数中调用setIsNewRecord(true)的变通方法,但在构造函数中属性似乎不可用 我必须删除构造函数,并在每个需要phpass的方法中生成语句 用户模型的构造函数:Php 由于构造函数的原因,Yii模型isNewRecord为false,php,mysql,activerecord,yii,Php,Mysql,Activerecord,Yii,在Yii ActiveRecord中,是否可以在模型构造函数中设置一个属性,并且仍然保持模型的isNewRecord属性为true 我有一个模型构造函数来创建一个私有属性来保存PHPPass密码哈希实例。当我这样做时,它会将isNewRecord属性设置为false,即使记录是新创建的 如果id属性大于零,我尝试了在构造函数中调用setIsNewRecord(true)的变通方法,但在构造函数中属性似乎不可用 我必须删除构造函数,并在每个需要phpass的方法中生成语句 用户模型的构造函数: p
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
}
验证contstructor时,请确保调用父构造函数。验证时始终调用父构造函数,除非您知道自己在做什么
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提供有关OVERding构造函数的链接
还有一个重要的要添加的注释:记住将参数传递给构造函数。在Yii模型类中,存在带有默认值的
$scenario
参数insert
。当您在不传递此参数的情况下验证构造函数时,将始终出现insert
场景,并且不会出现任何关于缺少参数的错误消息,因为它具有默认值。我用$scenario
更新了代码。通常,您应该避免在Yii类中重写构造函数。大多数组件都提供了一个方法,而这个方法正是您示例中代码的正确位置
区别在于,对于应用程序组件,对象将已经应用了所有配置。这与您的情况无关,但使用
init()
而不是\uu construct()
是一种很好的做法。您可以展示您尝试的解决方法吗?作为此答案的扩展,您可能希望查看以下问题的公认答案。它定义了调用parent::uu contstruct()的选项,以及何时应该在代码之前、之后调用它,或者完全不调用它。