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
}

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

你可能感兴趣的:(Vapor 2.0 - Droplet)