Vapor文檔學(xué)習(xí)十八:ROUTING - Collections

路由集合可以將多個路由和路由組組織到不同的文件或者模塊中。

Example

這是一個API中v1部分的路由集合例子:

import Vapor
import HTTP
import Routing

class V1Collection: RouteCollection {
    typealias Wrapped = HTTP.Responder
    func build<B: RouteBuilder where B.Value == Wrapped>(_ builder: B) {
        let v1 = builder.grouped("v1")
        let users = v1.grouped("users")
        let articles = v1.grouped("articles")

        users.get { request in
            return "Requested all users."
        }

        articles.get(Article.self) { request, article in
            return "Requested \(article.name)"
        }
    }
}

這個類可以放在任何文件中,我們都可以把它添加到Droplet中,也可以添加到其他路由組中。

Breakdown

為了更好地理解路由集合的概念,我們來一行一行的分析一下上面的代碼。

typealias Wrapped = HTTP.Responder

這句定義限制路由集合只能添加HTTP的響應(yīng)。雖然底層路由可以使用任意類型,但是Vapor只針對HTTP響應(yīng)。如果我們想在Vapor中使用路由結(jié)合,我們需要對封裝的類型進行匹配。

func build<B: RouteBuilder where B.Value == Wrapped>(_ builder: B) {

這個方法接收一個RouteBuilder類的參數(shù),并且要驗證這個RouteBuilder接收Wrapped,也就是上一行所定義的HTTP.ResponseDroplet和Vapor創(chuàng)建的所有路由組都是接收HTTP.ResponseRouteBuilder

let v1 = builder.grouped("v1")

現(xiàn)在builder創(chuàng)建路由就和平常一樣,builder: B的使用就和Droplet或路由組一樣,所有在Droplet/路由組中的方法在builder中一樣可以使用。

Empty Initializable

如果你有空的init方法,你可以向路由集合添加EmptyInitializable協(xié)議。這可以允許你通過集合類型名稱添加路由集合。

class V1Collection: RouteCollection, EmptyInitializable {
    init() { }
    ...

那么我們現(xiàn)在可以不進行初始化而直接添加路由集合:

drop.collection(V1Collection.self)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容