在 Yii 2.0 中测试 POST

Testing for POST in Yii 2.0

在 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()$modelCreateCrystal(); 但是,即使我在此条件下更改模型,它仍然会失败。如果可能的话,如果有人可以用通俗易懂的方式简要解释方法 'load' 实际上在做什么,那将会很有帮助。

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

为此,它首先以与 Yii 存储记录的方式相匹配的形式加载数据数组。它假定您要加载的数据的格式为

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

这是要检查的第一件事,而且,只要您的 _POST 数据确实到达控制器,通常就是 load() 失败的地方,尤其是如果您已经设置了自己的表单中的字段名称。这就是为什么如果您更改模型,模型将不会加载的原因。

然后检查哪些属性可以是 massively assigned。这仅表示属性是否可以像 $model->load() 方式那样一次性分配,或者是否必须一次设置一个,如

$model->title = "Some title";

为了决定一个属性是否可以被大量赋值,Yii 会查看你的 validation rules and your scenarios。它尚未验证它们,但如果存在该属性的验证规则,那么在那种情况下,它会假定它可以被大量分配。

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

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

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

希望对您有所帮助!