Vapor文档学习十八:ROUTING - Collections

路由集合可以将多个路由和路由组组织到不同的文件或者模块中。

Example

这是一个API中v1部分的路由集合例子:

import Vapor
import HTTP
import Routing

class V1Collection: RouteCollection {
    typealias Wrapped = HTTP.Responder
    func build(_ 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(_ builder: B) {

这个方法接收一个RouteBuilder类的参数,并且要验证这个RouteBuilder接收Wrapped,也就是上一行所定义的HTTP.ResponseDroplet和Vapor创建的所有路由组都是接收HTTP.ResponseRouteBuilder

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文档学习十八:ROUTING - Collections)