给控制器方法添加表单验证.md 2.7 KB


type: backend project: 通用 status: doing module: 接口 tags:

  • backend
  • 接口 created: 2026-06-09 updated: 2026-06-09 sensitive: false ---

@app-ghs/controllers/OrderController.php:1006-1024 请为 actionCreateOrder 控制器方法添加表单验证函数, 可查询 @Yii 里表单验证说明 ,另外也可参照 @app-ghs/controllers/DeliveryController.php:298-304 的实现,如果需要查询表结构,请根据以下信息来:

  1. @.cursor/rules/general-rules.mdc:191

  2. 请运行 db_struct 脚本,查询某表的结构

AI回答与处理

[23 tools called]

已完成对 app-ghs/controllers/OrderController.phpactionCreateOrder 方法的表单验证重构。

主要修改内容:

  1. 创建表单模型: 新建了 app-ghs/models/order/CreateOrderForm.php 文件,封装了开单所需的参数验证规则。

    • 包含了 customId, product 等必填项验证。
    • 包含了 modifyPrice 的格式验证。
    • 包含了 historyDate 的逻辑验证(自定义验证器 validateHistoryDate)。
    • 包含了 product 的 JSON 格式验证(自定义验证器 validateProduct)。
  2. 重构控制器: 修改了 app-ghs/controllers/OrderController.php 中的 actionCreateOrder 方法:

    • 引入了 ghs\models\order\CreateOrderForm
    • 使用 $form->loadAndValidate() 替代了原有的手动参数接收和 if (empty(...)) 校验。
    • 使用 $form->getAttributes() 获取经过验证的安全数据。
    • 移除了控制器中冗余的手动验证代码块(如客户ID校验、金额格式校验、花材JSON校验、订单日期校验)。

代码示例:

app-ghs/models/order/CreateOrderForm.php:

<?php
namespace ghs\models\order;

use common\components\dict;
use ghs\models\BaseForm;
use common\components\util;

class CreateOrderForm extends BaseForm
{
    // ... 属性定义 ...

    public function rules()
    {
        return [
            [['customId', 'product'], 'required', 'message' => '{attribute}不能为空'],
            // ... 类型验证 ...
            ['modifyPrice', 'match', 'pattern' => '/^\d+(\.\d{1,2})?$/', 'message' => '金额不能超2位小数'],
            ['product', 'validateProduct'],
            ['historyDate', 'validateHistoryDate'],
        ];
    }

    // ... 自定义验证方法 ...
}

app-ghs/controllers/OrderController.php:

    public function actionCreateOrder()
    {
        $form = new CreateOrderForm();
        $form->loadAndValidate(); // 自动加载 POST 数据并验证,失败则直接响应错误
        $post = $form->getAttributes();

        $shopId = $this->shopId;
        $customId = $post['customId'];

        // ... 后续业务逻辑 ...