1

我正在创建一个Yii应用程序,其中数据POST通过 REST 调用通过请求发送到我的服务器。由于场景中没有ActiveForm出现,使用正在发送数据的 Model 类验证数据的最佳方法是什么,并且在成功验证后,它将被保存到 db 表中。

我浏览了官方文档,但没有找到任何相关内容。由于提供了内置方法ActiveForm $model->validate(),我想知道这样的事情是否像为发布的数据调用函数一样简单,而无需使用我的类ActiveForm验证该数据。Model

我知道它可以完成,isset($_POST['somefield']但它有点传统的方法并且要为每个字段重复(我个人觉得检查数据是否发布在一个字段中然后分别对每个字段执行验证是一个无聊的活动)。

有没有我错过的官方文档?或者如果文档中没有给出,最好的方法是什么?

建议我一些创造代码魔法的东西..

4

2 回答 2

1

好的,经过更多研究后,我找到了解决上述问题的方法,如下所示:

    $model = new AppDetails();
    $model->setAttributes(Yii::$app->request->post(), false);
    if($model->validate() && $model->save())
    {
        return true;
    }
    return false;

根据Yii文档,setAttributes()是否以大量方式设置属性值。在这里,我为我的模型类创建了新对象,然后设置来自发布请求的属性。

一旦我将属性设置为我的模型类对象,我就可以validate()将它们直接保存在 db 中,save()仅在成功验证后调用 apply 。

但是,有了这个,您必须根据模型的规则部分发送所有属性(包括主键自动递增的值。如果您不通过像这样的休息调用发送它,您也可以稍后设置它们$model->id='')。否则,validate()将返回 false。

如果数据是从一个(根据我从我的编码经验中理解的)发布的,其中的字段设置为Model 类的对象,则更具体$model->load()地返回 true (请参阅此处的更多信息)。然后自动加载Yii 开发者设置的后台场景。Formload()formName

您可以尝试$model->load(Yii::$app->request->post())对通过 REST 调用发送的数据执行类似操作,因为未设置属性,它将始终返回 false。

我想我已经解释了上述问题的解决方案。如果有任何问题或无法很好理解,请务必指出。

我希望它可以帮助未来的读者解决同样的问题。

于 2016-04-07T14:22:50.077 回答
0

传统的有什么问题...

if ($model->load(Yii::$app->request->post()) && $model->validate()) {
    //$model loaded with post data and validated
}

...?

于 2016-04-06T17:10:43.067 回答