Droplet
是一個服務容器兴蒸,它可以給你提供許多Vapor工具蕾殴。它負責注冊路由坚踩、啟動服務器批幌、附加中間件(middleware)等等。
提示
通常應用程序只會有一個Droplet信姓。但是,對于高級用例,可以創(chuàng)建多個俊性。
初始化(Initialization)
您可能已經(jīng)看到趟薄,創(chuàng)建一個Droplet
實例所需的惟一東西就是導入Vapor。
import Vapor
let drop = try Droplet()
// your magic here
try drop.run()
Droplet
的創(chuàng)建通常發(fā)生在main.swift
文件。
筆記
為了簡單起見扑媚,大多數(shù)文檔示例代碼只使用main.swift
文件。在Swift依賴包管理器概念性概述中,您可以閱讀更多關于依賴包和模塊的內(nèi)容。
環(huán)境(Environment)
環(huán)境(environment
)可以通過droplet的配置來訪問。它包含應用程序正在運行的當前環(huán)境漫雕。通常是開發(fā)吟榴、測試或生產(chǎn)。
if drop.config.environment == .production {
...
}
環(huán)境影響配置(Config)和日志記錄(Logging)熊锭。默認為開發(fā)環(huán)境。要更改它碗殷,請將--env=
flag作為參數(shù)精绎。
vapor run serve --env=production
如果您在Xcode中代乃,您可以通過scheme編輯器傳遞參數(shù)。
警告
調(diào)試日志可以減少應用程序每秒處理的請求數(shù)量毒涧。允許生產(chǎn)模式使非臨界日志保持沉默唤冈。
Config目錄
workDir
屬性包含應用程序當前工作目錄的路徑你虹。Vapor使用此屬性查找與項目相關的文件夾绘搞,如Resources
、Public
和Config
董饰。
print(drop.workDir) // /var/www/my-project/
在大多數(shù)情況下蒿褂,Vapor自動決定工作目錄。但是卒暂,您可能需要手動設置它用于高級用例啄栓。
您可以通過Droplet
的初始化來覆蓋工作目錄,或通過--workdir
實現(xiàn)。
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
。比方說干厚,你想在生產(chǎn)中給自己發(fā)送錯誤日志李滴,但你不想在開發(fā)時給你的收件箱發(fā)垃圾郵件。
let config = try Config()
config.addConfigurable(log: MyEmailLogger.init, name: "email")
let drop = Droplet(config)
Droplet
將繼續(xù)使用默認的日志記錄器蛮瞄,直到您修改Config/droplet.json
文件指向您的電子郵件日志記錄器所坯。如果這是在Config/production/droplet.json
,然后你的記錄器只在生產(chǎn)中使用挂捅。
{
"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
讓我們創(chuàng)建一個自定義日志記錄器來展示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 + "!!!")
}
}
現(xiàn)在,使用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"
時,我們的新日志程序?qū)⒈皇褂谩?br>
Config/development/droplet.json
{
"log": "all-caps"
}
在這里伺糠,我們只在開發(fā)環(huán)境中設置我們的日志記錄器蒙谓。所有其他環(huán)境將使用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
的第一個參數(shù)是文件的名稱躁锡。
現(xiàn)在我們已經(jīng)將logger與ConfigInitializable
結合起來了,我們可以將類型名稱傳遞給 addConfigurable
毒租。
main.swift
let config = try Config()
config.addConfigurable(log: AllCapsLogger.self, name: "all-caps")
let drop = try Droplet(config)
現(xiàn)在稚铣,如果您在Config
文件夾中添加一個名為allCaps.json
的文件,您可以配置logger墅垮。
allCaps.json
{
"exclamationCount": 5
}
有了這種可配置的抽象惕医,您就可以輕松地更改應用程序在不同環(huán)境中的功能,而無需將這些值硬編碼到源代碼中算色。