在 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()
而 $model
是 CreateCrystal();
但是,即使我在此条件下更改模型,它仍然会失败。如果可能的话,如果有人可以用通俗易懂的方式简要解释方法 '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
数据数组。确保它具有我上面建议的形式。
希望对您有所帮助!
在 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();
但是,即使我在此条件下更改模型,它仍然会失败。如果可能的话,如果有人可以用通俗易懂的方式简要解释方法 '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
数据数组。确保它具有我上面建议的形式。
希望对您有所帮助!