0
点赞
收藏
分享

微信扫一扫

【Vapor】06 Chapter 8: Controllers


0x00 Chapter 8: Controllers

​​上篇文章​​​ 把各种路由都写在了 ​​routes.swift​​​ 文件内
如果路由事件太多,​​​routes.swift​​​ 文件就会越来越大
慢慢地就会变得难以管理与维护

所以,如何减轻路由的负担呢?
使用 ​​​Controllers​​ !

使用 ​​Controllers​​​ 还可以对 ​​新旧版本​​​ 的 ​​API​​ 进行区分管理

0x01 创建 Controllers 文件

1.Create the file in ​​Sources/App/Controllers​​​ and call it ​​AcronymsController.swift​

add the following code:

import Fluent
import Vapor

struct AcronymsController: RouteCollection {
func boot(routes: RoutesBuilder) throws {
}
}

create an ​​AcronymsController​​​ that conforms to ​​RouteCollection​

2.Add a new ​​route handler​​​ after ​​boot(routes:)​

struct AcronymsController: RouteCollection {
func boot(routes: RoutesBuilder) throws {
}

func getAllHandler(_ req: Request) throws -> EventLoopFuture<[Acronym]> {
Acronym.query(on: req.db).all()
}
}

3.Register the route in ​​boot(router:)​

struct AcronymsController: RouteCollection {
func boot(routes: RoutesBuilder) throws {
routes.get("api", "acronyms", use: getAllHandler)
}

func getAllHandler(_ req: Request) throws -> EventLoopFuture<[Acronym]> {
Acronym.query(on: req.db).all()
}
}

4.Open ​​routes.swift​​​ and ​​delete​​ the following handler

app.get("api", "acronyms") { req -> EventLoopFuture<[Acronym]> in
Acronym.query(on: req.db).all()
}

5.add the following to the end of ​​routes(_:)​

try app.register(collection: AcronymsController())

经过这 ​​5​​​ 个步骤,就成功的把路由 ​​app.get("api", "acronyms")​​​ 移动到了控制器 ​​AcronymsController​​ 内

0x02 其他路由

在 ​​AcronymsController.swift​​ 内添加其他路由处理方法

  • create

    func createHandler(_ req: Request) throws -> EventLoopFuture<Acronym> {
let acronym = try req.content.decode(Acronym.self)
return acronym.save(on: req.db).map { acronym }
}

  • retrieve a single acronym

    func getHandler(_ req: Request) throws -> EventLoopFuture<Acronym> {
Acronym.find(req.parameters.get("acronymID"), on: req.db)
.unwrap(or: Abort(.notFound))
}

  • update

    func updateHandler(_ req: Request) throws -> EventLoopFuture<Acronym> {
let updatedAcronym = try req.content.decode(Acronym.self)
return Acronym.find(req.parameters.get("acronymID"), on: req.db)
.unwrap(or: Abort(.notFound)).flatMap { acronym in
acronym.short = updatedAcronym.short
acronym.long = updatedAcronym.long
return acronym.save(on: req.db).map {
acronym
}
}
}

  • delete

    func deleteHandler(_ req: Request) throws -> EventLoopFuture<HTTPStatus> {
Acronym.find(req.parameters.get("acronymID"), on: req.db)
.unwrap(or: Abort(.notFound))
.flatMap { acronym in
acronym.delete(on: req.db)
.transform(to: .noContent)
}
}

  • filter group

    func searchHandler(_ req: Request) throws -> EventLoopFuture<[Acronym]> {
guard let searchTerm = req.query[String.self, at: "term"] else {
throw Abort(.badRequest)
}

return Acronym.query(on: req.db).group(.or) { or in
or.filter(\.$short == searchTerm)
or.filter(\.$long == searchTerm)
}.all()
}

  • first result

    func getFirstHandler(_ req: Request) throws -> EventLoopFuture<Acronym> {
Acronym.query(on: req.db).first().unwrap(or: Abort(.notFound))
}

  • sorting results

    func sortedHandler(_ req: Request) throws -> EventLoopFuture<[Acronym]> {
Acronym.query(on: req.db).sort(\.$short, .ascending).all()
}

最后进行路由与方法的注册

    func boot(routes: RoutesBuilder) throws {
routes.get("api", "acronyms", use: getAllHandler)
routes.post("api", "acronyms", use: createHandler)
routes.get("api", "acronyms", ":acronymID", use: getHandler)
routes.put("api", "acronyms", ":acronymID", use: updateHandler)
routes.delete("api", "acronyms", ":acronymID", use: deleteHandler)
routes.get("api", "acronyms", "search", use: searchHandler)
routes.get("api", "acronyms", "first", use: getFirstHandler)
routes.get("api", "acronyms", "sorted", use: sortedHandler)
}

0x03 路由组 - Route groups

在注册路由对应的方法时
会重复写 ​​​"api", "acronyms"​​​ 这些可以通过一个路由组来管理
减少重复代码

    func boot(routes: RoutesBuilder) throws {
// routes.get("api", "acronyms", use: getAllHandler)
// routes.post("api", "acronyms", use: createHandler)
// routes.get("api", "acronyms", ":acronymID", use: getHandler)
// routes.put("api", "acronyms", ":acronymID", use: updateHandler)
// routes.delete("api", "acronyms", ":acronymID", use: deleteHandler)
// routes.get("api", "acronyms", "search", use: searchHandler)
// routes.get("api", "acronyms", "first", use: getFirstHandler)
// routes.get("api", "acronyms", "sorted", use: sortedHandler)

let acronymsRoutes = routes.grouped("api", "acronyms")
acronymsRoutes.get(use: getAllHandler)
acronymsRoutes.post(use: createHandler)
acronymsRoutes.get(":acronymID", use: getHandler)
acronymsRoutes.put(":acronymID", use: updateHandler)
acronymsRoutes.delete(":acronymID", use: deleteHandler)
acronymsRoutes.get("search", use: searchHandler)
acronymsRoutes.get("first", use: getFirstHandler)
acronymsRoutes.get("sorted", use: sortedHandler)
}

0x04 我的作品

欢迎体验我的作品之一:​​小五笔​​​ 五笔学习好帮手~
​App Store​​ 搜索即可~


举报

相关推荐

0 条评论