読者です 読者をやめる 読者になる 読者になる

Play framework 2.0 での自作プラグイン - Scala版

Play framework 2.0 における基本的なプラグインの作成方法をご紹介します。

ちなみに Play framework 2.0 は JavaScala 用の Web アプリケーションフレームワークで、JPA・Akka・EhCache 等の機能をプラグインとして実装しています。

ソースは http://github.com/fits/try_samples/tree/master/blog/20120324/

事前準備

まずは、Play framework 2.0 の実行環境を用意します。
ダウンロードサイト からアーカイブをダウンロード、適当なディレクトリに解凍し、環境変数 PATH にパスを設定するだけです。


次に、自作プラグインを試すためのアプリケーションを用意します。
今回は Scala アプリケーションを用意しました。

アプリケーション作成例
> play new sampleApp
・・・
Which template do you want to use for this new application?

  1 - Create a simple Scala application
  2 - Create a simple Java application
  3 - Create an empty project

> 1

OK, application sampleApp is created.
・・・

プラグイン作成

プラグインは以下のようにして作成します。

  • play.api.Plugin トレイトを extends
  • クラスパラメーターとして play.api.Application を指定

Java の場合は play.Plugin クラスを extends して、コンストラクタの第一引数で play.Application を指定するようにします。*1


それでは、start と stop 時にログを標準出力するだけの単純なプラグイン SamplePlugin を作成してみます。

app/plugins/SamplePlugin.scala
package plugins

import play.api._

class SamplePlugin(app: Application) extends Plugin {
    val name = "sample plugin"

    override def onStart() {
        println("--- " + name + " start")
    }

    override def onStop() {
        println("--- " + name + " stop")
    }
}

プラグインを使うための設定

プラグインを使用するには conf/play.plugins ファイルを用意して、"<優先度>:<プラグインクラス>" というエントリを追加します。

SamplePlugin を使用するための設定は以下のようになります。(優先度は適当に付けました)

conf/play.plugins
450:plugins.SamplePlugin

動作確認

プラグインの動作確認を行うには、play コンソールから run を実行してアプリケーションを起動します。

アプリケーション起動
> cd sampleApp
> play
・・・
[sampleApp] $ run
・・・
[info] play - Listening for HTTP on port 9000...
・・・

この状態ではまだプラグインは実行されていないため (初回起動時であればコンパイルも未実施)、http://localhost:9000/ にアクセスしてみます。

そうすると、以下のように SamplePlugin が開始されます。

SamplePlugin 開始ログ
[info] Compiling 6 Scala sources and 1 Java source・・・
--- sample plugin start
[info] play - Application started (Dev)

プラグインの利用

プラグインは play.api.Application の plugin メソッドで取得できます。(play.api.Application のインスタンスは play.api.Play の current で取得できます)

それでは、Application コントローラーに手を加えて SamplePlugin の name 値を取得し表示するようにしてみます。

app/controllers/Application.scala
package controllers

import play.api._
import play.api.mvc._

object Application extends Controller {
    def index = Action {
        //プラグイン名取得
        val samplePluginName = Play.current.plugin[plugins.SamplePlugin].map(_.name).getOrElse("nothing")

        Ok(views.html.index("plugin: " + samplePluginName))
    }
}

アプリケーション実行中 (run) であれば、上記の変更を行った後で http://localhost:9000/ に再度アクセスしてみると、以下のように SamplePlugin が再実行され、画面にプラグイン名が表示されます。

SamplePlugin 再実行ログ
[info] Compiling 1 Scala source to ・・・

--- (RELOAD) ---

--- sample plugin stop
--- sample plugin start
[info] play - Application started (Dev)

最後に、Ctrl + D でアプリケーションを終了すると SamplePlugin の終了ログが出力されます。

アプリケーション終了時のログ
[info] play - Application started (Dev)
--- sample plugin stop

*1:ScalaJava でパッケージ名が異なる点に注意