YII - 当你可以在 Save() 函数之前编码时,为啥要使用 beforeSave()

Posted

技术标签:

【中文标题】YII - 当你可以在 Save() 函数之前编码时,为啥要使用 beforeSave()【英文标题】:YII - Why to use beforeSave() when you can code before Save() functionYII - 当你可以在 Save() 函数之前编码时,为什么要使用 beforeSave() 【发布时间】:2015-05-12 06:01:14 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

原因 1:MVC 中的 M

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

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

当您 insert 新记录和 update 现有记录时,您使用 save()。如果不使用 beforeSave 内置函数,则在保存代码之前,您必须拥有 2 个“手册”实例。 (代码行的“浪费”)

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

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

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

【讨论】:

感谢 Ofir 巴鲁克!有理由使用 beforeSave now !!赞成它【参考方案2】:

一个简单的例子:

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

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();

【讨论】:

谢谢!!所以基本上无论用户在哪里写 beforeSave() ,它都会在实际调用 save() 函数之前默认调用,对吗?正如您给出的示例,我们可以插入/更新日期,这很好,如果我们想添加/编辑我们通过表单添加的一些记录怎么办?是否可以在 beforeSave 中获取提交的表单记录? 第一个问题:是的。第二:有可能并且有意获取表单的提交记录。您可以通过 $this->attributeName 与他们联系。就像我的第二个例子一样。日期字段来自网络表单,只有在 beforeSave() 中更改了日期格式。 yii\behaviors\TimestampBehavior; 是解决这个问题的好方法吗? @bumbumpaw 这看起来是一种更好的方法。我在回答这个问题时使用的是版本 1。我看到他们在版本 2 中添加了行为。

以上是关于YII - 当你可以在 Save() 函数之前编码时,为啥要使用 beforeSave()的主要内容,如果未能解决你的问题,请参考以下文章

Yii 框架 -> 我的插入前数据库未在 save() 上触发

Yii2的save()方法容易出错的地方

Yii2 - 没有通过 $model->save() 更新值

基于 Yii 的 CMS? [关闭]

Yii2 ActiveRecord save失败

yii---进行增删改查