3

我知道beforeSave()YII 中函数的功能,该函数用于执行某些我们希望在保存数据之前执行的操作。

但是,就我们想在数据保存到数据库之前实现这一点而言,我们不能在调用 save() 之前直接编写此代码(-> save() 正在将记录存储到数据库)

因此,当我们直接在 save() 行之前编写该代码时,我不确定为什么我们需要创建像 beforeSave() 这样的特定函数来执行我们需要在调用 Save() 之前触发的操作。

有人可以解释一下吗?为此,我进行了很多搜索,但在每个页面上,它仅重定向到 beforeSave() 函数的解释。

4

2 回答 2

12

Yii 和其他 MVC 框架具有这些功能。

虽然您可以在控制器中编写“保存前”代码,但在功能之前save()- 使用该功能更加推荐和有用beforeSave()

原因 1:MVC 中的 M

beforeSave 与模型相关,因此在模型文件中处理模型属性(字段)的代码比在控制器中处理代码更合乎逻辑。

原因2:保存是为了插入和更新

save()insert新记录和update现有记录时使用。在不使用beforeSave内置函数的情况下,您必须先拥有 2 个“手册”实例,然后才能保存代码。(代码行的“浪费”)

原因 3:从另一个控制器保存模型

如果您被要求扩展您的应用程序并且现在您必须面对一个需要保存相同模型的新控制器(出于某种原因 - 只是一种可能的情况) - 您必须在保存之前复制您的“ " 该控制器的代码。而如果您使用的是内置beforeSave功能 - 您不会。

总之,框架的主要目的是减少您需要编写的代码,同时保持任何逻辑(MVC 分离)。虽然您可以做不同的事情,但为什么不使用已经存在的东西呢?

于 2015-05-12T06:14:11.093 回答
4

一个简单的例子:

我有一个包含两个日期字段的表格。每次我尝试执行插入或更新时,我都需要获取当前系统日期并根据操作类型进行操作。

public function beforeSave() {

    if ($this->isNewRecord) {
        $this->insertDate = new CDbExpression('NOW()');
    } else {
        $this->updateDate = new CDbExpression('NOW()');
    }

    return parent::beforeSave();
}

我写了一次,所以我不必每次在该对象上调用 save() 时都写。

还有一些数据库喜欢不同的时间格式,所以你可以在这里处理它们:

public function beforeSave() {
    $this->date = date('Y-m-d', $this->date);
    return parent::beforeSave();
}
于 2015-05-12T06:15:09.407 回答