Vapor 2.0 - Droplet

前往 Vapor 2.0 - 文檔目錄

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使用此屬性查找與項目相關的文件夾绘搞,如ResourcesPublicConfig董饰。

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)境中的功能,而無需將這些值硬編碼到源代碼中算色。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抬伺,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子灾梦,更是在濱河造成了極大的恐慌峡钓,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件若河,死亡現(xiàn)場離奇詭異能岩,居然都是意外死亡,警方通過查閱死者的電腦和手機萧福,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門拉鹃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鲫忍,你說我怎么就攤上這事膏燕。” “怎么了悟民?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵坝辫,是天一觀的道長。 經(jīng)常有香客問我射亏,道長近忙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任鸦泳,我火速辦了婚禮银锻,結果婚禮上,老公的妹妹穿的比我還像新娘做鹰。我一直安慰自己击纬,他們只是感情好,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布钾麸。 她就那樣靜靜地躺著更振,像睡著了一般炕桨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肯腕,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天献宫,我揣著相機與錄音,去河邊找鬼实撒。 笑死姊途,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的知态。 我是一名探鬼主播捷兰,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼负敏!你這毒婦竟也來了贡茅?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤其做,失蹤者是張志新(化名)和其女友劉穎顶考,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妖泄,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡驹沿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蹈胡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甚负。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖审残,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情斑举,我是刑警寧澤搅轿,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站富玷,受9級特大地震影響璧坟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赎懦,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一雀鹃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧励两,春花似錦黎茎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽踢代。三九已至,卻和暖如春嗅骄,著一層夾襖步出監(jiān)牢的瞬間胳挎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工溺森, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留慕爬,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓屏积,卻偏偏與公主長得像医窿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子肾请,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容