プラガブル
Play20 Scala

   Kazuhiro Sera
      (@seratch)
アジェンダ


軽く自己紹介
Play の拡張全般について
ScalikeJDBC のご紹介
#akskscala へのお誘い
誰?


Scala、Java がメインのプログラマ
いろいろやっています
#akskscala @赤坂(溜池山王)
Play は 1.0 出たときから
質問
質問


Play20 プラグイン作ったことがある
方はどれくらいいらっしゃいますか?
質問


Play20 プラグイン作ったことがある
方はどれくらいいらっしゃいますか?


と質問したものの、そもそもプラグイ
ンの定義って明確なんだっけ・・?
どうやらプラグインとは

明確な定義はされていないものの、どう
やらPlay20 プラグインは 2 種類ある
play.plugins に追加して使う Play ア
プリのランタイム機能拡張
play コンソールを拡張するための sbt
プラグイン
イメージ図

モジュール

プラグイン
                   プラグイン
 play.pluginsに追加   ではない形で
 (Play アプリ拡張)      Play を
                   拡張するもの
   sbt プラグイン
(play コンソール拡張)
typesafehub/play-plugins


dust           sbt プラグイン
guice          play.plugins
inject         play.plugins
mailer         play.plugins
redis          play.plugins
sbtgoodies     sbt プラグイン
sbtlogger      sbt プラグイン
util           (プラグインではない)
Play アプリ拡張
(play.plugins)
conf/play.plugins

公式 Wiki の説明参照
play.api.Plugin という trait
拡張ポイントはコンストラクタと
onStart/onStop/enabled のみ
(2.0.2 時点)
何ができるのか


コンストラクタや onStart でアプリ内
共通で使うものを準備しておく
典型例:コネクションプールの初期化
実際プラグインにすべき要件は多くない
早速つくってみよう

 app 直下に MyPlugin.scala

import play.api._
class MyPlugin(app: Application) extends Plugin {
  def onStart(): Unit = {
    println(“This is my first Play20 plugin!”)
  }
}
テストも書こう

import org.specs2.mutable.Specification
object MyPluginSpec extends Specification {
 "MyPlugin" should {
  "be available" in {
   running(FakeApplication(
    additionalPlugins = Seq("MyPlugin"),
    additionalConfiguration = Map("key", "value"))) {
    // do something ...
実際に使う

 conf/play.plugins に追加
 読み込み順序の数値は昇順
 Play 本体のプラグインの最後は
 GlobalPlugin (10000)

10001: MyPlugin
拙作の例

ScalikeJDBC Play Plugin
ScalikeJDBC は SQL テンプレート
ベースの DB アクセスライブラリ
conf/application.conf の DB 設定を
読み取ってコネクションプールを初期化
Tips
Tips

Plugin のコンストラクタや onStart、
onStop は一度しか呼ばれない?
Tips

Plugin のコンストラクタや onStart、
onStop は一度しか呼ばれない?

Production 環境ならそうだけど・・
Tips

Plugin のコンストラクタや onStart、
onStop は一度しか呼ばれない?

Production 環境ならそうだけど・・

テストだと FakeApplication は大量
に生成されて、その度に呼ばれまくる
(重たい処理はキャッシュするなど)
Play コンソール拡張
(sbt プラグイン)
sbt プラグイン

play コンソールは sbt のラッパーなの
ですべての sbt プラグインが利用可能
play コンソールに機能を追加するには
sbt プラグインを書く必要がある
Scala に慣れてないとハードル高め
拙作の例

ScalikeJDBC Mapper Generator
特に Play20 専用ではないので Play プ
ラグインとは表記していない
play コンソールで「scalikejdbc-gen
user」とやると user テーブルを元に
app/models/User.scala 自動生成
生成されたコード利用例

// app/models/User.scala
val user: Option[User] = User.find(123)
val count: Long = User.countAll()
DB localTx { implicit session =>
  User.findBy(“group_id = {groupId}”,
    ‘groupId -> 234) foreach { user =>
    user.copy(groupId = 345).save()
  }
}
プラグインではない
  Play 拡張
プラグインではない拡張

Play の機能を拡張するのにプラグイン
にとらわれる必要はない
@gakuzzzz さんによる play20-auth
は Controller に mixin して使う
Play20 を拡張、便利にするためにつく
られたものは何でもモジュール?
playmodules.net

有志の方が作ったサイト(非公式)
何かつくったらとりあえず登録してみる
のもいいかも
ただ、将来的には公式サイトにうまく集
約できる方がよさそう
ScalikeJDBC
  のご紹介
ScalikeJDBC

SQL を知っていればすぐ使える
コードをどこでもそのまま再利用可能
柔軟なトランザクション制御
複数のデータソースに同時アクセス
開発、サポートがとてもアクティブ
あえて短所も・・

他に比べてまだまだマイナー
O/R マッパーではない
記述はあまり DRY ではないのでコード
の自動生成によってカバーしている
Play20 については Typesafe Stack
に SLICK(ScalaQuery)が入る予定
試してみてください

mapper-generator とセットでどうぞ
レガシー DB 連携の業務実績あり
もしバグがあったら光の速さで直します
日本語の情報も増やす予定です
まずはこちらをご一読ください
#akskscala
 へのお誘い
Scala はじめませんか?


akskscala.github.com
隔週で木曜 20:00∼赤坂(溜池山王)
Play20 をやるなら Scala は必修です
次回は 7/26 zentasks をいじります

プラガブル Play20 Scala