美文网首页
Vapor文档学习七:Controllers

Vapor文档学习七:Controllers

作者: Supremodeamor | 来源:发表于2017-04-19 15:53 被阅读101次

Controllers可以帮你将相关功能整合到一起,或者创建一些依赖性的资源。

Basic

下面是一个基本的Controller

final class HelloController {
    func sayHello(_ req: Request) throws -> ResponseRepresentable {
        guard let name = req.data["name"] else { 
            throw Abort.badRequest 
        }
        return "Hello, \(name)"
    }
}

一个简单的控制器类不需要遵守任何协议,你可以自由的设计、实现你想要的功能。

Registering

实现注册唯一要做的事情就是为controller中的每个方法进行签名(看看上面sayHello方法的结构)。为了将controller中的方法注册到路由中去,需要方法实现类似于(Request) throws -> ResponseRepresentable的结构。 RequestResponseRepresentable的使用需要引入HTTP模块。

let hc = HelloController()
drop.get("hello", handler: hc.sayHello)

由于sayHello方法的签名与drop.get方法的闭包签名相匹配,所以我们可以直接传递。

Type Safe(类型安全)

你也可以使用具有类型安全路由的控制器方法:

final class HelloController {
    ...

    func sayHelloAlternate(_ req: Request, _ name: String) -> ResponseRepresentable {
        return "Hello, \(name)"
    }
}

sayHelloAlternate方法添加到HelloController当中,它可以接收第二个参数name: String

let hc = HelloController()
drop.get("hello", String.self, handler: hc.sayHelloAlternate)

类型安全的drop.get接收(Request, String) throws -> ResponseRepresentable签名之后,我们的方法就可以用作这个路由的闭包。

Resources

遵守ResourceRepresentable的Controllers可以很轻松的作为RESTful资源注册到路由当中,下面用UserController举例:

final class UserController {
    func index(_ request: Request) throws -> ResponseRepresentable {
        return try User.all().makeNode().converted(to: JSON.self)
    }

    func show(_ request: Request, _ user: User) -> ResponseRepresentable {
        return user
    }
}

上面的UserController是一个很基本的controller,包含indexshow两个路由,index路由返回的是所有user列表的json数据,show路由返回的是一个具体user的json数据。
我们注册这个controller的时候这样写:

let users = UserController()
drop.get("users", handler: users.index)
drop.get("users", User.self, handler: users.show)

但是ResourceRepresentable协议使得这个标准的RESTful结构变得非常容易:

extension UserController: ResourceRepresentable {
    func makeResource() -> Resource<User> {
        return Resource(
            index: index,
            show: show
        )
    }
}

UserController遵守ResourceRepresentable协议要求将
showindex方法的签名与Resource<User>期望的格式相匹配。

看一下Resource类的实现:

final class Resource<Model: StringInitializable> {
    typealias Multiple = (Request) throws -> ResponseRepresentable
    typealias Item = (Request, Model) throws -> ResponseRepresentable

    var index: Multiple?
    var store: Multiple?
    var show: Item?
    var replace: Item?
    var modify: Item?
    var destroy: Item?
    var clear: Multiple?
    var aboutItem: Item?
    var aboutMultiple: Multiple?

    ...
}

现在UserController遵守了ResourceRepresentable协议,注册路由就变的简单了:

let users = UserController()
drop.resource("users", users)

drop.resource只会注册通过调用makeResource()方法提供的路由。在这种情况下,只会启用indexshow这两个路由。

Note:drop.resource还为OPTIONS requests添加了有用的默认值。这些可以被重写。

Folder

Controllers可以放在应用的任何目录下,但是一般放在Controllers/目录中。

Modules

如果你的项目比较庞大,你可能需要在单独的模块中创建Controllers,这样可以允许你对你的controllers进行单元测试。更多关于模块创建的信息请参考文档Swift Package Manager

相关文章

  • Vapor文档学习七:Controllers

    Controllers可以帮你将相关功能整合到一起,或者创建一些依赖性的资源。 Basic 下面是一个基本的Con...

  • Vapor学习之Controllers

    控制器 控制器可以用来组织你的代码,它们是一系列用于接收 request 和返回 response 的方法集合。通...

  • Vapor-Controllers

    方法 和普通类不同的是Controllers的方法都应该接受一个Request参数并返回一个ResponseEnc...

  • Vapor 2.0 - 概述

    前往 Vapor 2.0 - 文档目录 Vapor的文档 这是关于Vapor的文档,它是一个适用于iOS、macO...

  • Vapor 2.0 - 使用JSON(Using JSON)

    前往 Vapor 2.0 - 文档目录 用Vapor(With Vapor) 这个包在默认情况下被Vapor包含了...

  • 使用Swift4+Vapor写后端-Droplet和Route

    warning 本篇作为vapor文档基础篇,读起来很无聊,很漫长,很空洞。为了后面的vapor生活,务必认真学习...

  • 用Swift 写服务端

    Perfect 好像这个是最早面世的服务端框架 Perfect 中文文档Vapor Vapor 文档IBM开源 ...

  • Vapor 2.0 - 使用节点(Using Node)

    前往 Vapor 2.0 - 文档目录 带有Vapor(With Vapor) 默认情况下,该包附件包含在Vapo...

  • Vapor 2.0 - 使用位(Using Bits)

    前往 Vapor 2.0 - 文档目录 带有Vapor(With Vapor) 默认情况下,该包附件包含在Vapo...

  • Vapor 的安装

    搭建环境 Vapor文档 如果这里出错可以看vapor官方文档进行安装。 这里安装环境是Mac 安装 HomeBr...

网友评论

      本文标题:Vapor文档学习七:Controllers

      本文链接:https://www.haomeiwen.com/subject/gaxhzttx.html