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使用此属性查找与项目相关的文件夹,如Resources
、Public
和Config
。
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
}
有了这种可配置的抽象,您就可以轻松地更改应用程序在不同环境中的功能,而无需将这些值硬编码到源代码中。