Validation 蒸汽验证器

Validation 蒸汽验证器,validation,vapor,Validation,Vapor,这是一个与Vapor ValidationSuite和Validator相关的Swift Vapor问题 我的类有一个name变量。我过去常常将名称声明为字符串。但我想在这个领域进行验证。因此,我继承了已验证名称字段的属性。请参见下面的示例代码 class Name: ValidationSuite { static func validate(input value: String) throws { let evaluation = OnlyAlphanumeric.self &am

这是一个与Vapor ValidationSuite和Validator相关的Swift Vapor问题

我的类有一个name变量。我过去常常将名称声明为字符串。但我想在这个领域进行验证。因此,我继承了已验证名称字段的属性。请参见下面的示例代码

class Name: ValidationSuite {
static func validate(input value: String) throws {
let evaluation = OnlyAlphanumeric.self
    && Count.min(5)
    && Count.max(20)
    try evaluation.validate(input: value)
  }
}
下面的代码显示了我的类。有趣的观点;这继承自模型类(当它连接到数据库时),并使用一个节点作为ID。您可以看到我声明了name变量以符合name类型

final class LedgerUser: Model {
var id: Node?
var name: Name

这会产生两个“表达式类型不明确,没有更多上下文”。我猜这与节点从mySQL数据库检索字符串时不知道如何将其转换为名称类型有关。

使用验证器的语法类似于
Valid

请在此处查看有关常见用法的文档:

以下代码应该可以工作:

final class LedgerUser: Model {
    var id: Node?
    var name: Valid<Name>
最终分类账本:模型{
变量id:节点?
变量名称:有效
谢谢@Tanner

对于那些遇到相同问题的人-在实例化类时,您只需传入整个请求对象。在下面的示例中,请看shoprequest。这是我弄错的地方。Vapor为您完成了繁重的工作。例如:

drop.post("shop")     { shoprequest in

guard let name = shoprequest.data["name"].string else {
    throw Abort.custom(status: .badRequest, message: "Please enter a shop")
}

do {
    var coffeeshop = try CoffeeShop(request: shoprequest)
}
catch let error as ValidationErrorProtocol {
    print(error.message)
    throw Abort.custom(status: .badRequest, message: "Please check your coffee shop name")
}

return "You were a good coffee shop name."
}
因此,当您尝试实例化一个CoffeeShop对象时,它会根据您的规则对其进行验证

class CoffeeShop {
var name: Valid<Name>

init(request: Request) throws {
    name = try request.data["name"].validated()
}
}
class咖啡店{
变量名称:有效
init(请求:请求)抛出{
name=try request.data[“name”].validated()
}
}