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

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形式のスケジュール指定ができたと思いますが、この辺もいまは自前でしょうか。

Eclipseを使う

Playは各種IDE用の設定ファイルを作成してくれる機能があるので、Eclipseでインポートすることは簡単です。
ただし、コントローラからテンプレートの呼び出しの部分で型チェックが行われるのですが、Eclipseからテンプレートを変更しても自動でコンパイルされないため、コントローラでコンパイルエラーになってしまいます。また、コマンドラインからコンパイルしてもEclipseでうまく反映されないことがありました。
このへんはIDEのサポートを期待したいです。特にIntelliJ IDEA。

感想

私が使ったのはRCなのでリリース版とは異なる部分があるかもしれません。ただ、現時点でPlay 1.2の後継として期待するのは厳しいです。Scalaで書き直した結果、硬派というか、あまり至れり尽くせりな感じはありません。ScalaならまだしもJavaで2.0を選択するのは、ちょっと早いかなと思います。これもPlay 1.2の完成度がそれだけ高かったということだと思いますので、今後に期待したいと思います。