You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Vuetify表单中通过Model/Controller实现后端验证与弹窗提示

实现后端驱动的Vuetify表单验证(Laravel + Vue)

需求概述

  • 所有字段为空时,弹出提示:You must input all the fields.
  • 员工编码为非数字时,弹出提示:Employee Code must be a number.
  • 员工编码长度不为5位时,弹出提示:Employee Code is 5 digit only.
  • 员工姓名包含数字时,弹出提示:Employee Name must be a letter.
  • 所有验证逻辑在Laravel后端(Controller/Model)实现,不添加Vue前端验证规则

1. 后端验证实现(Laravel Controller)

修改Controller.php的store方法,添加验证逻辑,验证失败时返回错误响应:

public function store(Request $request)
{
    $employee_data = $request->all();
    $errors = [];

    // 验证所有字段是否为空
    if (empty($employee_data['emp_code']) && empty($employee_data['emp_name']) && empty($employee_data['emp_age'])) {
        $errors[] = "You must input all the fields.";
    } else {
        // 验证员工编码
        if (!empty($employee_data['emp_code'])) {
            if (!is_numeric($employee_data['emp_code'])) {
                $errors[] = "Employee Code must be a number.";
            }
            if (strlen($employee_data['emp_code']) != 5) {
                $errors[] = "Employee Code is 5 digit only.";
            }
        }

        // 验证员工姓名(不含数字)
        if (!empty($employee_data['emp_name']) && preg_match('/\d/', $employee_data['emp_name'])) {
            $errors[] = "Employee Name must be a letter.";
        }

        // 可选:验证年龄格式
        if (!empty($employee_data['emp_age']) && !is_numeric($employee_data['emp_age'])) {
            $errors[] = "Age must be a number.";
        }
    }

    // 存在错误时返回422状态码
    if (!empty($errors)) {
        return response()->json(['errors' => $errors], 422);
    }

    // 验证通过,执行插入逻辑
    $employee_code = "12345";
    $employee_model = new EmployeeModel();
    DB::transaction(function() use($employee_model, $employee_data, $employee_code){
        $employee_model->InsertEmployee($employee_data, $employee_code);
    });

    return response()->json(['message' => 'Employee inserted successfully'], 200);
}

2. 前端Vue修改(处理后端错误提示)

通过Vuetify的v-snackbar组件展示后端返回的验证提示,修改如下:

第一步:添加状态到data

data: () => ({
    emp_code: null,
    emp_name: null,
    emp_age: null,
    snackbar: false,
    snackbarText: ''
}),

第二步:修改Insert方法处理错误

methods: {
    Insert(){
        axios.post('api/employees', {
                emp_code: this.emp_code,
                emp_name: this.emp_name,
                emp_age: this.emp_age
            })
        .then(res => {
            console.log(res.data)
            // 重置表单
            this.emp_code = null
            this.emp_name = null
            this.emp_age = null
            // 提示成功
            this.snackbarText = res.data.message
            this.snackbar = true
        })
        .catch(err => {
            if (err.response?.data?.errors) {
                // 弹出第一个错误提示
                this.snackbarText = err.response.data.errors[0]
                this.snackbar = true
            } else {
                this.snackbarText = 'An error occurred.'
                this.snackbar = true
            }
        })
    }
}

第三步:添加Snackbar到模板

在v-row下方添加:

<v-snackbar v-model="snackbar" timeout="3000">
    {{ snackbarText }}
    <template v-slot:action="{ attrs }">
        <v-btn text v-bind="attrs" @click="snackbar = false">
            Close
        </v-btn>
    </template>
</v-snackbar>

3. 可选:Model层验证实现

若希望验证逻辑放在Model层,可修改EmployeeModel.php并在Controller捕获异常:

修改EmployeeModel.php

public function InsertEmployee($employee_data, $employee_code){
    $errors = [];

    if (!empty($employee_data['emp_code'])) {
        if (!is_numeric($employee_data['emp_code'])) {
            $errors[] = "Employee Code must be a number.";
        }
        if (strlen($employee_data['emp_code']) != 5) {
            $errors[] = "Employee Code is 5 digit only.";
        }
    }

    if (!empty($employee_data['emp_name']) && preg_match('/\d/', $employee_data['emp_name'])) {
        $errors[] = "Employee Name must be a letter.";
    }

    if (!empty($errors)) {
        throw new \Exception(implode('; ', $errors));
    }

    // 原有插入逻辑
    $employee_data['EmployeeCode'] = $employee_data['emp_code'];
    $employee_data['EmployeeName'] = $employee_data['emp_name'];
    $employee_data['Age'] = $employee_data['emp_age'];
    $employee_data['UpdatedBy'] = $employee_code;
    $dao_insert_employee = new DAO();
    $dao_insert_employee->InsertEmployee($employee_data, $employee_code);
}

修改Controller.php捕获异常

public function store(Request $request)
{
    $employee_data = $request->all();
    $employee_code = "12345";
    $employee_model = new EmployeeModel();
    
    try {
        DB::transaction(function() use($employee_model, $employee_data, $employee_code){
            $employee_model->InsertEmployee($employee_data, $employee_code);
        });
        return response()->json(['message' => 'Employee inserted successfully'], 200);
    } catch (\Exception $e) {
        return response()->json(['errors' => [$e->getMessage()]], 422);
    }
}

内容的提问来源于stack exchange,提问作者Keyboard Corporation

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 09:37:03