控制器动作的Yii2验证

时间:2016-10-01 16:42:57

标签: validation yii2

我正在开发一个Yii 2.0应用程序,用户可以在其中创建订单,然后发送订单进行审核,之后它将遵循工作流程中的多个阶段。

直到昨天,客户要求在发送订单审核订单之前可能会考虑作为草稿。这意味着我必须在创建时关闭验证并在用户单击“发送到审阅”按钮时对其进行验证。我知道Yii 2.0支持场景,但也许场景不适用于此,因为Send To Review按钮显示在只读视图中。这迫使我在控制器操作中进行验证,因为没有send_to_review视图。如何做到这一点(我的意思是控制器动作中的模型验证)?

这是控制器动作代码

public function actionSendToReview($id)
{
    if (Yii::$app->user->can('Salesperson'))
    {
        $model = $this->findModel($id);
        if ($model->orden_stage_id == 1 && $model->sales_person_id == Yii::$app->user->identity->id)
        {
            $model->orden_stage_id = 2;
            $model->date_modified = date('Y-m-d h:m:s');
            $model->modified_by = Yii::$app->user->identity->username;

            //TODO: Validation logic if is not valid show validation errors
            //for example "For sending to review this values are required:
            //list of attributes in bullets"
            //A preferred way would be to auto redirect to update action but 
            //showing the validation error and setting scenario to              
            //"send_to_review".


            $model->save();
            $this::insertStageHistory($model->order_id, 2);
            return $this->redirect(['index']);
        }
        else
        {
            throw new ForbiddenHttpException();
        }
    }
    else
    {
        throw new ForbiddenHttpException();
    }
}

我需要解决的是TODO。 选项1:在同一视图中显示验证错误,用户必须使用clic更新按钮更改请求的值保存,然后再次尝试发送到审阅。 选项2:自动重定向到更新视图已设置控制器中的场景和验证错误。

谢谢,

最好的问候

1 个答案:

答案 0 :(得分:0)

您可以在控制器中使用$model ->validate()进行验证。

public function actionSendToReview($id)
{
    if (Yii::$app->user->can('Salesperson'))
    {
        $model = $this->findModel($id);
        if ($model->orden_stage_id == 1 && $model->sales_person_id == Yii::$app->user->identity->id)
        {
            $model->orden_stage_id = 2;
            $model->date_modified = date('Y-m-d h:m:s');
            $model->modified_by = Yii::$app->user->identity->username;



            //TODO: Validation logic if is not valid show validation errors
            //for example "For sending to review this values are required:
            //list of attributes in bullets"
            //A preferred way would be to auto redirect to update action but 
            //showing the validation error and setting scenario to              
            //"send_to_review".

            //optional
            $model->scenario=//put here the scenario for validation;

             //if everything is validated as per scenario
             if($model ->validate())
            {                   
               $model->save();
               $this::insertStageHistory($model->order_id, 2);
               return $this->redirect(['index']);
            }
            else
            {
                return $this->render('update', [
                 'model' => $model,
               ]);
            }


        }
        else
        {
            throw new ForbiddenHttpException();
        }
    }
    else
    {
        throw new ForbiddenHttpException();
    }
}

如果您不需要在actionCreate()中进行验证。请创建一个不验证任何字段的方案并在那里应用。