Route Collections
路由集合允许将多个路由和路由组组织在不同的文件或模块中。
Example
以下是v1
API部分的路由集合示例:
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)"
}
}
}
这个类可以放在任何文件中,可以将它添加到vapor
或甚至添加到另一个路由组中。
let v1 = V1Collection()
drop.collection(v1)
然后Droplet
将build(_:)
方法传递给路由集合,并添加各种路由。
Breakdown
我们逐一分解路由集合,来了解它们到底生发了什么。
typealias Wrapped = HTTP.Responder
这限制了路由集合只添加HTTP响应。虽然底层路由器能够路由任何类型,但Vapor只针对HTTP响应者。如果在vapor
要使用这个路由集合,首先它的包裹类型需要匹配。
func build<B: RouteBuilder where B.Value == Wrapped>(_ builder: B) {
这个方法接收一个路由构造器并通过接收Wrapped
来验证路由构造器,如上一行所定义,HTTP.Responder
s。vapor
的Droplet
和Vapor
创建的任何路由组都是只接受HTTP响应的RouteBuilders。
let v1 = builder.grouped("v1")
从上面代码看出,照常可以通过builder
来创建路由。builder:B
同样像Droplet
或路由组一样工作。任何在Droplet
和路由组上工作的方法都可以在这个builder
上工作。
Empty Initializable
如果有空的init
方法,可以将EmptyInitializable
添加到路由集合。这允许通过其类型名称添加路线集合。
class V1Collection: RouteCollection, EmptyInitializable {
init() { }
...
现在我们可以添加到集合而不初始化它。
drop.collection(V1Collection.self)
继续学习vapor学习教程-目录