Play frameworkのいろいろなモジュール1 – Play-ScalaGen

2011.08.20

はじめに

このblogでも何度かPlay frameworkについて解説してきました。

その中でモジュールについても少し解説しましたが、モジュールは小さなPlay frameworkのアプリケーションであり、
さまざまな機能を提供してくれます。
たとえばPlay frameworkは標準でCRUDモジュールを使用することができます。
これは特定のクラスを継承したコントローラとモデルを作成すれば、そのモデルに対するCRUD機能が使用できるようになるモジュールです。
Play frameworkではコミュニティから提供された便利なモジュールを使用することもできますし、自分でモジュールを作成することもできます。
この記事ではPlay frameworkの便利なモジュールについて紹介していきます。

Play-Scalagen

今回紹介するPlayモジュールは、Play-Scalagen ※1というモジュールです。
このモジュールを使用すると、コマンドを実行してJPAのCRUDモデルをScalaで生成することができるようになります。
生成されるコードがScalaのため、前提としてPlay frameworkをScalaで記述できるようになるplay-scalaモジュール ※2の使用が必須です。

インストール

まずはPlay-Scalagenをインストールします。
なお、本記事での動作確認環境は下記の通りです。

  • OS : MacOS X 10.7.1
  • Java SE: 1.6.0_26
  • Play framework : 1.2.2
  • Git: 1.7.4
  • mySQL: 5.5
    • Play frameworkはインストールしてパスを通しておいてください。

      1.play-scalaのインストール

      まずはplay-scalaモジュールのインストールです。
      「play install scala」と入力してインストールしてください。

      $ play install scala
      ~        _            _ 
      ~  _ __ | | __ _ _  _| |
      ~ | '_ \| |/ _' | || |_|
      ~ |  __/|_|\____|\__ (_)
      ~ |_|            |__/   
      ~
      ~ play! 1.2.2, http://www.playframework.org
      ~
      ~ Will install scala-0.9.1
      ~ This module is compatible with: 1.2.2
      ~ Do you want to install this version (y/n)? y
      ~ Installing module scala-0.9.1...
      ~
      ~ Fetching http://www.playframework.org/modules/scala-0.9.1.zip
      ~ [--------------------------100%-------------------------] 38259.6 KiB/s    
      ~ Unzipping...
      ~
      ~ Module scala-0.9.1 is installed!
      ~ You can now use it by adding it to the dependencies.yml file:
      ~
      ~ require:
      ~     play -> scala 0.9.1
      ~
      

      2.Play-Scalagenをclone

      gitを使用してPlay-Scalagenをcloneします。
      適当なディレクトリを作成して、
      https://github.com/asinghal/Play-ScalaGen.git をcloneしましょう。

      $ git clone https://github.com/asinghal/Play-ScalaGen.git
      Cloning into Play-ScalaGen...
      remote: Counting objects: 385, done.
      remote: Compressing objects: 100% (237/237), done.
      remote: Total 385 (delta 169), reused 280 (delta 64)
      Receiving objects: 100% (385/385), 662.74 KiB | 219 KiB/s, done.
      Resolving deltas: 100% (169/169), done.
      

      Play-Scalagenをcloneした場所を覚えておいてください。

      サンプルプロジェクトを作成

      play-scalaのサンプルプロジェクトを作成します。

      $ play new myproject --with scala

      --with scalaオプションをつけると、play-scalaのプロジェクトとして生成されます。

      設定ファイルを修正、依存関係更新

      作成したmyprojectの、conf/dependencies.ymlファイルを編集します。
      $PLAYSCALAGEN_PATHと書いてあるところは、さきほどplay-scalagenをcloneしたディレクトリを指定してください。

      # Application dependencies
      
      require:
          - play
          - play -> scala 0.9.1
          - customModules -> scalagen
      
      repositories:
          - playCustomModules:
              type: local
              artifact: "$PLAYSCALAGEN_PATH"
              contains:
                  - customModules -> *
      

      ファイルを編集したら、依存関係を更新します。
      依存関係更新にはplay depsコマンドを使用します。

      $ cd myproject 
      $ play deps
      ~        _            _ 
      ~  _ __ | | __ _ _  _| |
      ~ | '_ \| |/ _' | || |_|
      ~ |  __/|_|\____|\__ (_)
      ~ |_|            |__/   
      ~
      ~ play! 1.2.2, http://www.playframework.org
      ~
      Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8
      ~ Resolving dependencies using /yourprojectpath/myproject/conf/dependencies.yml,
      ~
      ~ 	play->scala 0.9.1 (from playLocalModules)
      ~ 	customModules->customModules -> (from playCustomModules)
      ~
      ~ Installing resolved dependencies,
      ~
      ~ 	modules/scala-0.9.1 -> /yourplaypath/modules/scala-0.9.1
      ~ 	modules/dist -> /yoursscalagenpath/Play-ScalaGen
      ~
      ~ Done!
      ~
      

      最後に、モデルを保存するDBを用意します。 mysqlにログインし、「myproject」という名前のデータベースを作成します。
      データベースを作成したら、conf/applicaion.confファイルを編集します。
      #db=mysql:user:pwd@database_nameとなっている箇所のコメントをはずし、ユーザー名、パスワード、データベース名を指定してください。

      ・・・・・
      # To connect to a local MySQL5 database, use:
      db=mysql:<your-user>:<your-password>@myproject
      #
      # If you need a full JDBC configuration use the following :
      ・・・・・
      

      これで準備完了です。

      使ってみる

      では実際に使用してみましょう。
      今回は名前とメールアドレスだけを持つUserモデルを作成しました。
      コマンドをいくつか実行し、設定ファイルを編集すればすぐに完成します。

      1.jQueryファイルの用意

      まずは、自動生成したビューが使用するjQueryのファイルを用意するコマンドを実行します。
      これはプロジェクトごとに1度おこなっておけば良いコマンドです。

      $ play scalagen:jquery
      ~        _            _ 
      ~  _ __ | | __ _ _  _| |
      ~ | '_ \| |/ _' | || |_|
      ~ |  __/|_|\____|\__ (_)
      ~ |_|            |__/   
      ~
      ~ play! 1.2.2, http://www.playframework.org
      ~
      ~ Warning! /pgdev/play/projects/myproject/app/views/main.scala.html already exists and will be overriden (y/n)? y
      ~ Copied /pgdev/srcs/Play-ScalaGen/app/views/main.scala.html to /pgdev/play/projects/myproject/app/views/main.scala.html 
      ・・・・・・・・・・・・・
      ~~~~~ Copied JQuery files
      

      2.コントローラー生成

      次に、コントローラーを生成します。

      $ play scalagen:generate --scaffold User name:String email:String
      Listening for transport dt_socket at address: 8000
      10:18:11,263 INFO  ~ Starting /yourpath/myproject
      ・・・・・・
      Please add the following entries to the routes file
      GET     /users/                                 UsersController.index
      GET     /users/new                              UsersController.newValue
      GET     /users/grid                              UsersController.grid
      *     /users/create                             UsersController.create
      GET     /users/{id}/edit                        UsersController.edit
      *     /users/{id}/update                        UsersController.update
      GET     /users/{id}/delete                      UsersController.delete
      GET     /users/{id}                             UsersController.show
      

      play scalagen:generate --scaffoldとすると、コントローラー、ビューファイル、単体テストクラスが生成されます。
      その後ろに、User(エンティティ名) name:String email:String(プロパティ名)と記述します。
      最後にroutesファイルに追加するように指示されました。
      conf/routesファイルにusersのrouteパスを追加しましょう。

      # Routes
      # This file defines all application routes (Higher priority routes first)
      # ~~~~
      
      # Home page
      GET     /                                       Application.index
      
      # Ignore favicon requests
      GET     /favicon.ico                            404
      
      # Map static resources from the /app/public folder to the /public path
      GET     /public/                                staticDir:public
      
      GET     /users/                                 UsersController.index
      GET     /users/new                              UsersController.newValue
      GET     /users/grid                              UsersController.grid
      *     /users/create                             UsersController.create
      GET     /users/{id}/edit                        UsersController.edit
      *     /users/{id}/update                        UsersController.update
      GET     /users/{id}/delete                      UsersController.delete
      GET     /users/{id}                             UsersController.show
      
      # Catch all
      #*       /{controller}/{action}                  {controller}.{action}
      
      

      3.モデル生成

      $ play scalagen:generate --model User name:String email:String
      ・・・・・・
      * app/utils/HttpBinder.scala already exists. Skipping.
      * app/utils/JQGridHelper.scala already exists. Skipping.
      * Created /pgdev/play/projects/myproject/app/models/User.scala
      * Created /pgdev/play/projects/myproject/test/tests/User.scala
      * Created /pgdev/play/projects/myproject/test/user.yml
      

      最後にモデルの生成をします。
      play scalagen:generate --modelコマンドでモデルの生成を行います。
      その後ろにはUser(エンティティ名) name:String email:String(プロパティ名)を入力します。

      4.動作確認

      まずはテストを行ってみましょう。

      $ play test
      10:28:19,597 WARN  ~ You're running Play! in DEV mode
      ・・・・・・・・・・・・
      ~ Go to http://localhost:9000/@tests to run the tests
      ~
      

      play testコマンドで起動し、http://localhost:9000/@testsをブラウザで開きます。
      スタートボタンでテストを実行してみてください。すべてのテストが成功するはずです。 では自分で動かしてみましょう。
      http://localhost:9000/users/
      にアクセスしてみてください。
      ユーザー情報の登録、表示、削除など、一通りの機能が使用でき、ページングや検索も使用できます。

      まとめ

      非常に簡単にplay-scalaでCRUDページの生成ができました。
      冒頭で書きましたが、Play frameworkにも標準でCRUDモジュールというモジュールがCRUD機能を提供してくれます。
      こういった自動生成生成系のツールをうまく利用して生産性を高めましょう。

      参考サイトなど