ドキュメント

§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.conf` または `application.conf` 内で明示的に定義できます。

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

詳細については、移行ページ依存性注入のドキュメントを参照してください。

§アプリケーションライフサイクル

モジュールは、シングルトンインスタンスに`play.api.inject.ApplicationLifecycle`トレイトを注入し、シャットダウンフックを追加することで、Playのシャットダウンが発生したことを検出できます。

詳細については、`ApplicationLifecycle` の例ApplicationLifecycleリファレンスを参照してください。

§Playモジュールのテスト

モジュールは、`GuiceApplicationBuilder` を使用し、モジュールにバインディングを追加することで、Playの組み込みテスト機能を使用してテストできます。

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からの移行


このドキュメントに誤りを見つけましたか? このページのソースコードはこちらにあります。ドキュメントガイドラインをお読みいただいた後、プルリクエストをお送りください。質問やアドバイスがありましたら、コミュニティフォーラムにアクセスして、コミュニティとの会話を始めてください。