📜  laravel 验证存在与其他列匹配 - TypeScript (1)

📅  最后修改于: 2023-12-03 15:17:17.160000             🧑  作者: Mango

使用 Laravel 在 TypeScript 中验证存在与其他列匹配

在使用 Laravel 进行开发时,我们经常需要对输入进行验证。其中一个常见的用例是验证某个输入是否与另一个表的某个列中的值匹配。

在 TypeScript 中实现这个功能,我们需要使用 Laravel 的 Validation 类,以及 TypeScript 的类对象和类型注释。

安装 Laravel

如果您还没有安装 Laravel,请先按照官方文档的指引进行安装:https://laravel.com/docs/installation

创建验证规则

要验证输入是否存在于另一个表的某个列中,我们需要在 Laravel 的 Validation 类中创建一个自定义验证规则。

在 TypeScript 中,将规则定义为类方法是最方便的方法。以下是一个使用 TypeScript 实现的示例:

import { ValidationException } from "./exceptions/ValidationException";

export class CustomValidator {

    public static async existsInOtherColumn(table: string, column: string): Promise<boolean> {
        return async (value: string): Promise<boolean> => {
            const count = await DB.table(table).where(column, value).count();
            if (count < 1) {
                throw new ValidationException(`The selected ${column} is invalid.`);
            }
            return true;
        };
    }

}

在上面的示例中,existsInOtherColumn 方法返回一个异步函数,该函数使用给定的表和列参数执行数据库查询,并返回 truefalse。如果返回 false,则将在验证中显示错误消息。

创建验证器

现在我们已经创建了自定义验证规则,我们可以在需要验证的任何地方使用它。在本例中,我们将创建一个自定义验证器。

验证器是一个 TypeScript 类,它包含一个或多个表单字段的验证。以下是一个使用 TypeScript 实现的示例:

import { CustomValidator } from "./CustomValidator";
import { ValidationException } from "./exceptions/ValidationException";

export class CustomValidator {
    
    public async validate(data: any) {
        const validation = await Validator.make(data, {
            name: "required",
            email: ["required", "email", await CustomValidator.existsInOtherColumn("users", "email")]
        });
        if (validation.fails()) {
            throw new ValidationException(validation.errors.all());
        }
    }

}

在上面的示例中,我们使用 Validator.make() 方法创建一个新的验证器。我们添加了一个“必填”规则和一个“电子邮件”规则,还添加了我们之前创建的“存在于其他列中”规则。

如果任何规则失败,我们抛出一个自定义的 ValidationException 异常,该异常包含所有验证错误信息。

将验证器用于控制器

现在,我们可以使用创建的自定义验证器来验证控制器中的表单输入。以下是一个示例:

import { CustomValidator } from "./CustomValidator";
import { Request } from "express";

export class UserController {

    public async createUser(request: Request) {
        await new CustomValidator().validate(request.body);
        // do something with valid input
    }

}

在上面的示例中,我们创建了一个名为 createUser() 的方法,该方法接受一个 Request 对象并验证传入的表单数据。如果输入有效,则我们可以执行其他操作。

结论

在 TypeScript 中使用 Laravel 进行验证并不难。我们可以使用 Laravel 的 Validation 类和 TypeScript 的类对象和类型注释来创建自定义验证规则和验证器。这使我们能够轻松地验证表单输入,确保输入的安全性。