Yii2:如何完善单独的验证模型并保存模型?

时间:2017-03-06 16:28:08

标签: yii2

在哪种情况下最好使用Validate模型?示例:我有两个模型

  1. AgreementForm
  2. 协议
  3. 当我创建数据时 - 我使用

    $model = new AgreementForm();
    if ( $model->load( \Yii::$app->request->post() ) && $model->save() ) {
    ....
    }
    

    AgreemtnForm代码

    AgreementForm extemds Model {
    ......
     public function save() {
       if(!$this->validate()) {
        return null;
       }
       $model = new Agreement();
       $model->content = $this->content;
       if( $model->save() ) {
        return true;
       }
    }
    

    但是当我更新数据时,我只使用该代码:

    public function actionUpdate( $id ) {
    
        $model = Agreement::findOne( $id );
    
        if( $model->load( \Yii::$app->request->post() ) &&  $model->save() ){
    
    
    
            $this->refresh();
        }
        else {
            return $this->render('update', [
                'model' => $model,
            ]);
        }
    
    }
    

    如果我在另一个模型中复制验证,那么这种情况下的验证模型是什么?我可以只使用1个型号吗?

1 个答案:

答案 0 :(得分:1)

我将尝试解释为什么您应该几乎总是使用Form模型来验证您的数据,提供一些案例:

1)做

if( $model->load( \Yii::$app->request->post() ) &&  $model->save() )

可能很危险,用户可以发送他不应该发布的帖子数据。 例如。协议有一个userid列,它获取创建它的用户的id。如果用户在post请求中发送此字段,则可能会更改其值。 您的表单模型应该定义您希望发送的属性。

2)您希望根据例如为您的模型定义其他验证。用户角色,协议有效的时间等 假设您有2个用户角色:

  • 零售商
  • 商户

零售商可以创建长度为300个字符,最高价格为1000的协议,而商家则为700和10000。 你是如何应对的?

您可以创建两种不同的表单:

$user = Yii::$app->user;
if ($user->can('retailer')) {
    $model = new RetailerAgreementForm();
}
else {
    $model = new MerchantAgreementForm();
}
if ( $model->load( \Yii::$app->request->post() ) && $model->save() ) {
....
}

在表单模型中,您可以为字段添加其他验证:

public function rules()
{
    return [
        ['body', 'string', 'max' => 300],
        ['price', 'integer', 'max'=> 1000],
    ];
}

使用不同的表格我相信是最好的选择。

3)您的表单模型字段与数据库模型列1到1不对应。 考虑这个例子: 您想要保存协议,街道,州和城市的地址。你有一个城市,州和街道列表。 你想要对地址做的唯一事情是保存并加载它,例如。没人会去搜索每个城市。 因此,您只需在表中定义列地址(类型文本)并将数据另存为JSON。

您的AgreementForm将地址定义为单独的字段并相应地验证它们,您的协议模型只是将地址验证为字符串。

不要在AgreementForm和Agreement模型之间复制验证。他们应该定义不同的验证规则。

注意:即使您不在视图中呈现表单并仅发布一些数据,最好使用表单模型来准确获取要更改的字段,如果需要,还可以使用其他规则对其进行验证。我能想到的唯一直接使用数据库模型的情况是你想为你的模型提供一些基本的crud操作。