Vapor文档学习十八: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的响应。虽然底层路由可以使用任意类型,但是Vapor只针对HTTP响应。如果我们想在Vapor中使用路由结合,我们需要对封装的类型进行匹配。

func build<B: RouteBuilder where B.Value == Wrapped>(_ 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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容