Play framework2.0を使ってみた
ちょうどPlay framework 2.0が正式にリリースされたましたが、1ヶ月くらい前(RC2くらいのころ)に、Scalaの方を少し試してみたときのメモや感想です。とりあえず、Play Scalaのチュートリアル(‘Yet Another Blog Engine’)を、2.0で写経してみました。もともとScala版のチュートリアルは、CRUD(いわゆるスカッフォールディング)などのモジュールがないため、Java版のチュートリアルにある後半部分(管理画面や認証機能)がないのですが、今回も同じところまでです。
コードは以下においてありますが、私はScalaについては本は読んだけど実際にまとまった量のコードは書いたことがない初心者なので、Scalaのコードとしては酷いレベルだと思います。
kenichiro22/yabe-play20-scala
Play 2.0からの仕様変更やサポートされなくなった機能の影響などで、チュートリアルのコードのうち以下のような部分は変更しています。
Bootstrap
Bootstrapクラスに書いていた初期化処理は、play.api.GlobalSettinsを継承したクラスに書く。
object Global extends GlobalSettings { override def onStart(app: Application) { if (app.mode == Mode.Dev) { // 開発環境での初期データの登録 InitialData.insert() } } }
Fixtures
FixturesというYAMLからデータを読み込む機能がなくなっています。Scalaのコードで書いてもYAMLとそんなにかわらないということのようです。
Seq( User(Id(1), "bob@gmail.com", "secret", "Bob", false), User(Id(2), "jef@gmail.com", "secret", "Jef", false) ).foreach(User.create)
Anorm
1.2のScalaモジュールや2.0の途中までは、モデルクラスでMagic[T]を継承しておくとinsert/updateや基本的なselect文は自動生成していましたがこれはなくなったようです。例えばone-to-manyの集約なんかもScalaのコレクションAPIを使うということのようです。いちいち基本的なSQLを書くのは面倒なので、別のORMを使うか自前で自動生成部分を書く必要がありそうです。
テンプレートヘルパー
テンプレートはこれまでのGroovyベースからScalaベースのものに変更されています。コントローラーや静的リソースにアクセスするためのヘルパーメソッドがかなり変わっています。@action(controllers.Application.***) は @routes.Application.*** になっていて、@asset は@routes.Assets.at になってます。
Flashスコープ
Flashスコープの使い方は以下のような感じです。
def postComment(postId: Long) = Action { implicit request => Ok(〜).flashing("success" -> "Success!") }
Controllerで↑のようにしておいて、テンプレート↓で受け取る。
@(/* 通常のテンプレート引数 */)(implicit flash: Flash)
Captcha
チュートリアルでcaptchaを使っているのですが、2.0ではCaptcha関連のクラスがまだないようだったので、JCaptchaというライブラリを使いました。sbtで依存ライブラリの管理を行います。
Job
Jobというクラスを使ってスケージュール実行を行なっていましたが、AkkaというScalaのアクターライブラリを使う方針のようです。前はCron形式のスケジュール指定ができたと思いますが、この辺もいまは自前でしょうか。