文件

§撰寫 Play 模組

注意:此頁面涵蓋新的 模組系統 以新增 Play 的功能。

已棄用的 play.api.Plugin 系統已從 2.5.x 中移除。

可以使用任何依賴注入框架撰寫 模組。但是,當您想要擴充 Play 時,您需要避免依賴特定框架,以便您的擴充可以獨立於依賴注入運作。Play 以前使用 play.api.Plugin 系統來執行此目的,但在 2.5.x 中,外掛已改用 Play 模組。

Play 模組是一個擴充 play.api.inject.Module 的類別,且可以註冊到 Play 中,而不用明確依賴特定的依賴注入框架。這讓所有人都可以使用 Play 模組。

可以在 模組目錄 中取得 Play 模組清單。

此外,由於 Play 使用 Play 模組作為內建功能,因此必須使用 Play 模組來取代或擴充內建功能。

§建立和遷移 Play 模組

建立 Play 模組很簡單

class MyCode {
  // add functionality here
}

class MyModule extends play.api.inject.Module {
  def bindings(environment: Environment, configuration: Configuration): Seq[play.api.inject.Binding[_]] = {
    Seq(bind[MyCode].toInstance(new MyCode))
  }
}

如需更多資訊,請參閱 外掛至模組 的「建立模組類別」區段。

§模組註冊

預設情況下,Play 會載入任何在根目錄 (「app」目錄) 中定義的名為 Module 的類別,或
您可以在 reference.confapplication.conf 中明確定義它們

play.modules.enabled += "modules.MyModule"

請參閱 遷移頁面相依性注入文件 以取得更多詳細資料。

§應用程式生命週期

模組可以透過將 play.api.inject.ApplicationLifecycle 特質注入單例實例並加入關閉掛勾,來偵測 Play 關閉時發生什麼事。

請參閱 `ApplicationLifecycle` 範例ApplicationLifecycle 參考 以取得更多詳細資料。

§測試 Play 模組

模組可以使用 Play 內建的測試功能進行測試,使用 GuiceApplicationBuilder 並加入模組的繫結。

val application = new GuiceApplicationBuilder()
  .bindings(new MyModule)
  .build()
val myCode = application.injector.instanceOf(classOf[MyCode])
myCode must beAnInstanceOf[MyCode]

請參閱 使用 Guice 進行測試 以取得更多詳細資料。

§列出現有的 Play 模組

Modules.locate(env, conf) 方法會顯示應用程式中所有可用的 Play 模組清單。

§覆寫內建模組

有一些情況,Play 提供內建模組,必須覆寫。

例如,訊息功能由MessagesApi 特質實作,並由DefaultMessagesApi支援。如果您撰寫一個延伸 MessagesApi 的替換類別 MyMessagesApi,您可以使用下列方式繫結它

class MyI18nModule extends play.api.inject.Module {
  def bindings(environment: Environment, configuration: Configuration): Seq[play.api.inject.Binding[_]] = {
    Seq(
      bind[Langs].toProvider[DefaultLangsProvider],
      bind[MessagesApi].toProvider[MyMessagesApiProvider]
    )
  }
}

§測試覆寫

測試應用程式時,應該使用 overrides 方法取代現有實作

val application = new GuiceApplicationBuilder()
  .overrides(new MyI18nModule)
  .build()

§註冊覆寫

因為 I18nModule 會在 reference.conf 中自動載入,所以您必須先停用預設模組,才能新增替換模組

play.modules.disabled += "play.api.i18n.I18nModule"
play.modules.enabled += "modules.MyI18nModule"

發佈 Play 模組時,您不應該在 reference.conf 中停用現有模組,因為這可能會產生意外後果。請參閱遷移頁面以取得詳細資訊。

下一步:從外掛 API 遷移


在此文件中發現錯誤了嗎?此頁面的原始程式碼可以在這裡找到。在閱讀文件指南後,請隨時提交拉取請求。有問題或建議要分享嗎?請前往我們的社群論壇與社群展開討論。