2

これは、Vapor ValidationSuite および Validator に関連する Swift Vapor の質問です。

私のクラスには name 変数があります。名前を文字列として宣言していました。しかし、このフィールドで検証を実行したかったのです。そこで、検証済みの 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)
  }
}

次のコードは私のクラスを示しています。興味深い点; これは (データベースに接続するため) Model クラスから継承し、ID に Node を使用します。Name 型に準拠するように name 変数を宣言したことがわかります。

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

これにより、いくつかの「式のタイプがあいまいであり、コンテキストがありません」が生成されます。ノードが mySQL データベースから文字列を取得し、それを Name 型にキャストする方法がわからないことに関連していると思いますか?

4

2 に答える 2

2

バリデーターを使用するための構文は次のようになりValid<Name>ます。

ここで一般的な使用法に関するドキュメントを確認してください: https://vapor.github.io/documentation/guide/validation.html#common-usage

次のコードが機能するはずです。

final class LedgerUser: Model {
    var id: Node?
    var name: Valid<Name>
于 2016-08-21T18:32:46.853 に答える
1

ありがとう@タナー。

同じ問題が発生した場合は、クラスをインスタンス化するときにリクエスト オブジェクト全体を渡すだけです。次の例では、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()
}
}
于 2016-08-27T20:17:08.420 に答える