路由集合可以將多個路由和路由組組織到不同的文件或者模塊中。
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.Response
。Droplet
和Vapor創(chuàng)建的所有路由組都是接收HTTP.Response
的RouteBuilder
。
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)