Php 在Yii 2.0中测试POST

Php 在Yii 2.0中测试POST,php,yii2,yii2-advanced-app,gii,Php,Yii2,Yii2 Advanced App,Gii,在Gii创建的控制器中,常见以下情况: if($model->load(Yii::$app->request->post()) && $model->save()){ //.....do something such as redirect after save....// }else { //.....render the form in initial state.....// } 这用于测试是否从我的表单发送帖子&&我指定的模型保存了帖子信息(据我

在Gii创建的控制器中,常见以下情况:

if($model->load(Yii::$app->request->post()) && $model->save()){
//.....do something such as redirect after save....//
}else
{
//.....render the form in initial state.....//
}
这用于测试是否从我的表单发送帖子&&我指定的模型保存了帖子信息(据我所知)

我在我自己创建的控制器中也做过类似的操作,但在某些情况下,这个条件会被忽略,因为其中一个或两个条件都失败了,表单在我提交表单后会以初始状态呈现,我可以看到帖子在网络上传播

有人能解释为什么这个条件会失败吗?我相信问题出在'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”,因为我试图将发布的数据保存到本例中的
frequesubjoin()
,而
$model
CreateCrystal()Model
类的
load()
方法基本上是用用户的数据填充模型,例如
post
查询

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

\u发布['Model name']['attribute name']

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

然后检查属性可以是什么。这仅仅意味着属性是否可以大规模分配,如
$model->load()
方式,或者是否必须一次设置一个属性,如

$model->title = "Some title";
为了决定是否可以大规模分配属性,Yii查看您和您的。它还没有验证它们,但是如果在该场景中存在该属性的验证规则,那么它假设可以大规模地分配该属性

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

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

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

我希望这有帮助

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

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

\u发布['Model name']['attribute name']

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

然后检查属性可以是什么。这仅仅意味着属性是否可以大规模分配,如
$model->load()
方式,或者是否必须一次设置一个属性,如

$model->title = "Some title";
为了决定是否可以大规模分配属性,Yii查看您和您的。它还没有验证它们,但是如果在该场景中存在该属性的验证规则,那么它假设可以大规模地分配该属性

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

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

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


我希望这有帮助

这很有帮助!谢谢你周到的回复。我确实更改了名称,因此我确信这是问题所在,但我也可以看到验证规则如何也会出错,特别是如果我使用的“视图模型”在没有正确处理这些属性和规则的情况下拉入了一堆基础模型。希望它能在@Scott中奏效。当你有机会测试它时,如果这个答案对你有效,那么如果你能接受这个答案,让其他用户看到什么是最好的答案,这将是非常有用的。谢谢这很有帮助!谢谢你周到的回复。我确实更改了名称,因此我确信这是问题所在,但我也可以看到验证规则如何也会出错,特别是如果我使用的是“视图模型”