Vapor 2.0 - Droplet

前往 Vapor 2.0 - 文档目录

Droplet是一个服务容器,它可以给你提供许多Vapor工具。它负责注册路由、启动服务器、附加中间件(middleware)等等。

提示
通常应用程序只会有一个Droplet。但是,对于高级用例,可以创建多个。

初始化(Initialization)

您可能已经看到,创建一个Droplet实例所需的惟一东西就是导入Vapor。

import Vapor

let drop = try Droplet()

// your magic here

try drop.run()

Droplet的创建通常发生在main.swift文件。

笔记
为了简单起见,大多数文档示例代码只使用main.swift文件。在Swift依赖包管理器概念性概述中,您可以阅读更多关于依赖包和模块的内容。

环境(Environment)

环境(environment)可以通过droplet的配置来访问。它包含应用程序正在运行的当前环境。通常是开发、测试或生产。

if drop.config.environment == .production {
    ...
}

环境影响配置(Config)和日志记录(Logging)。默认为开发环境。要更改它,请将--env=flag作为参数。

vapor run serve --env=production

如果您在Xcode中,您可以通过scheme编辑器传递参数。

警告
调试日志可以减少应用程序每秒处理的请求数量。允许生产模式使非临界日志保持沉默。

Config目录

workDir属性包含应用程序当前工作目录的路径。Vapor使用此属性查找与项目相关的文件夹,如ResourcesPublicConfig

print(drop.workDir) // /var/www/my-project/

在大多数情况下,Vapor自动决定工作目录。但是,您可能需要手动设置它用于高级用例。

您可以通过Droplet的初始化来覆盖工作目录,或通过--workdir实现。

vapor run serve --workdir="/var/www/my-project"

修饰属性(Modifying Properties)

Droplet的属性可以通过编程方式或通过配置进行更改。

Programmatic

Droplet上的属性是常量,可以通过init方法覆盖。

let drop = try Droplet(server: MyServerType.self)

在这里,Droplet使用的服务器类型被更改为自定义类型。当运行Droplet时,这个自定义服务器类型将被引导而不是默认服务器。

警告
手动使用init方法会覆盖已配置的属性。

Configurable

如果您想修改Droplet的属性,在某些情况下,您可以使用addConfigurable。比方说,你想在生产中给自己发送错误日志,但你不想在开发时给你的收件箱发垃圾邮件。

let config = try Config()
config.addConfigurable(log: MyEmailLogger.init, name: "email")

let drop = Droplet(config)

Droplet将继续使用默认的日志记录器,直到您修改Config/droplet.json文件指向您的电子邮件日志记录器。如果这是在Config/production/droplet.json,然后你的记录器只在生产中使用。

{
    "log": "email"
}
支持的属性(Supported Properties)
Property Type droplet.json key Config Initializable
server ServerProtocol.Type server no
client ClientProtocol.Type client no
log LogProtocol log yes
hash HashProtocol hash yes
cipher CipherProtocol cipher yes
middleware Middleware middleware.[server,client] no
console ConsoleProtocol console yes
cache CacheProtocol cache yes
Example

让我们创建一个自定义日志记录器来展示Vapor的可配置属性。
AllCapsLogger.swift

final class AllCapsLogger: LogProtocol {
    var enabled: [LogLevel] = []
    func log(_ level: LogLevel, message: String, file: String, function: String, line: Int) {
        print(message.uppercased + "!!!")
    }
}

现在,使用addConfigurable的日志方法,将logger添加到Droplet中。
main.swift

let config = try Config()
config.addConfigurable(log: AllCapsLogger(), name: "all-caps")

let drop = try Droplet(config)

当在droplet.json中把"log"属性设置为"all-caps"时,我们的新日志程序将被使用。
Config/development/droplet.json

{
    "log": "all-caps"
}

在这里,我们只在开发环境中设置我们的日志记录器。所有其他环境将使用Vapor的默认日志记录器。

Config Initializable

为了更加便利,您可以允许自定义类型从配置文件中初始化。

在前面的示例中,我们在将它添加到Droplet之前初始化AllCapsLogger

假设我们希望允许我们的项目配置每个日志消息添加了多少感叹号。
AllCapsLogger.swift

final class AllCapsLogger: LogProtocol {
    var enabled: [LogLevel] = []
    let exclamationCount: Int

    init(exclamationCount: Int) {
        self.exclamationCount = exclamationCount
    }

    func log(_ level: LogLevel, message: String, file: String, function: String, line: Int) {
        print(message.uppercased + String(repeating: "!", count: exclamationCount))
    }
}

extension AllCapsLogger: ConfigInitializable {
   init(config: Config) throws {
        let count = config["allCaps", "exclamationCount"]?.int ?? 3
        self.init(exclamationCount: count)
   } 
}

Note
config的第一个参数是文件的名称。

现在我们已经将logger与ConfigInitializable结合起来了,我们可以将类型名称传递给 addConfigurable
main.swift

let config = try Config()
config.addConfigurable(log: AllCapsLogger.self, name: "all-caps")

let drop = try Droplet(config)

现在,如果您在Config文件夹中添加一个名为allCaps.json的文件,您可以配置logger。
allCaps.json

{
    "exclamationCount": 5
}

有了这种可配置的抽象,您就可以轻松地更改应用程序在不同环境中的功能,而无需将这些值硬编码到源代码中。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,817评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,329评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,354评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,498评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,600评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,829评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,979评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,722评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,189评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,519评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,654评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,940评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,762评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,993评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,382评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,543评论 2 349

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,065评论 4 62
  • 什么是穷人心智模式? 穷人和过于忙碌的人有一个思维特质,即注意力被稀缺资源过分占据,引起认知和判断力的全面下降。不...
    叶两步阅读 372评论 3 29
  • 我们常常说要有目标,我们却没有真正的好好的去想过自己的目标。 中国有一个成语叫南辕北辙,很好的解释了方向不对的问题...
    悠然小霞阅读 488评论 0 2
  • 原文再续书接上一回,上一回说到房祖名找老爷爷做蛋糕,老爷爷不鸟他。 房祖名在老爷爷门前无聊地等了三个小时。 他说,...
    陈素封阅读 485评论 2 1