路由集合可以将多个路由和路由组组织到不同的文件或者模块中。
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的响应。虽然底层路由可以使用任意类型,但是Vapor只针对HTTP响应。如果我们想在Vapor中使用路由结合,我们需要对封装的类型进行匹配。
func build<B: RouteBuilder where B.Value == Wrapped>(_ builder: B) {
这个方法接收一个RouteBuilder
类的参数,并且要验证这个RouteBuilder
接收Wrapped
,也就是上一行所定义的HTTP.Response
。Droplet
和Vapor创建的所有路由组都是接收HTTP.Response
的RouteBuilder
。
let v1 = builder.grouped("v1")
现在builder
创建路由就和平常一样,builder: B
的使用就和Droplet或路由组一样,所有在Droplet/路由组中的方法在builder中一样可以使用。
Empty Initializable
如果你有空的init
方法,你可以向路由集合添加EmptyInitializable
协议。这可以允许你通过集合类型名称添加路由集合。
class V1Collection: RouteCollection, EmptyInitializable {
init() { }
...
那么我们现在可以不进行初始化而直接添加路由集合:
drop.collection(V1Collection.self)