【问题标题】:Yii model isNewRecord false due to constructorYii 模型 isNewRecord false 由于构造函数
【发布时间】:2013-05-02 17:51:17
【问题描述】:

在 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']);
}

控制器中的用户模型初始化和 isNewRecord 条件

public function actionEdit($id = null)
{

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

【问题讨论】:

  • 您能展示一下您尝试过的解决方法吗?

标签: php mysql activerecord yii


【解决方案1】:

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

【讨论】:

  • 作为此答案的扩展,您可能希望查看以下问题的已接受答案。它以非常清晰的方式定义了调用 parent::__contstruct() 的选项以及何时应该在代码之前、之后或根本不调用它。 stackoverflow.com/questions/5119141/…
【解决方案2】:

通常你应该避免在 Yii 类中重写构造函数。大多数组件都提供了一个 init() 方法,而不是像您的示例中这样的代码的正确位置。

不同之处在于,对于应用程序组件,对象已经应用了所有配置。这与您的情况无关,但使用 init() 而不是 __construct() 仍然是一种好习惯。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 2020-09-18
    • 2012-05-18
    • 2020-01-14
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多