Php 在Yii 2.0中测试POST
在Gii创建的控制器中,常见以下情况: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.....// } 这用于测试是否从我的表单发送帖子&&我指定的模型保存了帖子信息(据我
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()然而,即使我在这个条件下更改模型,它仍然失败。如果可能的话,有人能用外行的话简单地解释一下“load”方法实际上在做什么,那将是很有帮助的。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中奏效。当你有机会测试它时,如果这个答案对你有效,那么如果你能接受这个答案,让其他用户看到什么是最好的答案,这将是非常有用的。谢谢这很有帮助!谢谢你周到的回复。我确实更改了名称,因此我确信这是问题所在,但我也可以看到验证规则如何也会出错,特别是如果我使用的是“视图模型”