Scala PlayframeworkのController、Actionとは?

個人開発したアプリの宣伝
目的地が設定できる手帳のような使い心地のTODOアプリを公開しています。
Todo with Location

Todo with Location

  • Yoshiko Ichikawa
  • Productivity
  • Free

スポンサードリンク

PlayframeworkのControllerのメソッド、Action{}とはなんぞや?の整理。

def index() = Action{ implicit request =>
    Ok("Hello World")
}

自分なりの解釈なので、間違ってたらごめんなさい。


Actionの定義

Action.scalaActionBuildertraitのapplyメソッドのシンタクス。つまり省略せずに書くと、こういことと同義。

def index() ={
  Action.apply( (request) => { Ok("hello") } )
}

または、

def index() = {
  Action.apply( implicit request => { Ok("hello") })
}


Action.scalaActionBuilderはControllerの継承ツリーではなくてimport play.api.mvc._でObjectを読み込んでいるんだと思う。

定義的には同ファイル内のActionBuilderImplがtraitActionBuilderをmixinし、objectActionBuilderActionBuilderImplを継承しているっぽい。objectがapplyしてるのかなあと思ったけどどうやら違うっぽい。


ActionBuilder applyの定義

これはほぼ見たまま。

final def apply(block: R[B] => Result): Action[B] = async(block.andThen(Future.successful))

引数block: R[B] => ResultResult型を返す高階関数をとる。つまり

{ implicit request =>
    Ok("Hello World")
}

のラムダ式部分がapplyの引数。

block.andThen(Future.successful)

この部分で、blockの実行結果、すなわち定義した高階関数の結果、ResultandThenFuture.successfulに渡す。

と読める。

すなわち、implicit requestにアクセスする必要がないならば、

def index() = Action.async{ Future.successful( Ok("hello World!!") )}

としても動作する。