1

在 Gii 创建的我的控制器中,通常会看到以下内容:

if($model->load(Yii::$app->request->post()) && $model->save()){
//.....do something such as redirect after save....//
}else
{
//.....render the form in initial state.....//
}

这可以测试是否从我的表单发送 POST && 我指定的模型已保存发布的信息(据我了解)。

我已经在我自己创建的控制器中进行了类似的操作,但在某些情况下,这个条件会被绕过,因为这些条件中的一个或两个都失败了,并且在我提交表单之后表单只是以初始状态呈现,我可以看到POST 通过网络传输。

有人可以解释为什么这个条件会失败吗?我相信问题出在 'Yii::$app->request->post()' 上,因为我已经删除了 '$model->save()' 部分进行测试,但它仍然绕过了条件。

在我的控制器中失败的示例代码:

public function actionFreqopts()
{

    $join = new FreqSubtypeJoin();
    $options = new Frequency();
    $model = new CreateCrystal();
    if ($model->load(Yii::$app->request->post()) && $model->save()) {

        $model->insertFreqopts();
        return $this->redirect(['fieldmap', 'id' => $join->id]);
    } else {
        return $this->render('freqopts', ['join' => $join, 'options' => $options]); 
    }
}

我最初的想法是我没有指定正确的“$model”,因为我试图将发布的数据保存到FreqSubtypeJoin()这种情况下,$model但是CreateCrystal();,即使我在这个条件下更改模型,它仍然失败。如果可能的话,如果有人可以用外行的术语简要解释“加载”方法实际上在做什么,那将会很有帮助。

4

1 回答 1

0

类的load()方法Model基本上是用来自用户的数据填充模型,例如post查询。

为此,它首先以与 Yii 存储记录的方式相匹配的形式加载数据数组。它假定您尝试加载的数据在表单中

_POST['Model name']['attribute name']

这是要检查的第一件事,只要您的_POST数据实际到达控制器,通常load()就会失败,特别是如果您在表单中设置了自己的字段名称。这就是为什么如果您更改模型,模型将不会加载。

然后它会检查哪些属性可以被大量分配。这只是意味着属性是否可以像方式一样被整体分配$model->load(),或者它们是否必须一次设置一个,就像在

$model->title = "Some title";

为了决定一个属性是否可以被大量分配,Yii 会查看你的验证规则和你的场景。它还没有验证它们,但是如果该属性存在验证规则,那么在这种情况下,它会假定它可以被大量分配。

因此,接下来要检查的是场景。如果你没有设置,或者没有使用它们,那么这里应该没有问题。Yii 将使用默认场景,其中包含您拥有验证规则的所有属性。如果你使用了场景,那么 Yii 将只允许你加载你在场景中声明的属性。

接下来要检查的是您的验证规则。Yii 将只允许您大量分配具有关联规则的属性。

最后两个通常不会导致load()失败,你只会得到一个不完整的模型,所以如果你的模型没有加载,那么我建议查看从表单提交数据的方式并检查_POST正在发送的数据数组. 确保它具有我上面建议的形式。

我希望这有帮助!

于 2015-12-25T01:32:34.243 回答