💭

Scalaのcontrollerクラスに触れる

2020/12/22に公開

今回はScalaのcontrollerクラスに触れていきます。例によって、scala-play-seedでsbt newするとできるHomeController.scalaを解読していきます。

HomeController.scala

package controllers

import javax.inject._
import play.api._
import play.api.mvc._

/**
 * This controller creates an `Action` to handle HTTP requests to the
 * application's home page.
 */
@Singleton
class HomeController @Inject()(val controllerComponents: ControllerComponents) extends BaseController {

  /**
   * Create an Action to render an HTML page.
   *
   * The configuration in the `routes` file means that this method
   * will be called when the application receives a `GET` request with
   * a path of `/`.
   */
  def index() = Action { implicit request: Request[AnyContent] =>
    Ok(views.html.index())
  }
}

冒頭packageとimportの数々

package

冒頭のpackage ~の記述は、パッケージと言って、通常、格納しているフォルダ名を記述します。
HomeController.scalaのファイルには、package cotrollersと記述があります。こうすることで、同階層のメンバー(クラス、トレイト、関数など)にアクセスすることができます。他パッケージ(ライブラリや他のフォルダ、パッケージのメンバーへのアクセスには下記importを使います)

import

packageのした部分に記述してあるimport文は、他パッケージ(ライブラリや他のフォルダ、パッケージのメンバーへのアクセスするときに使用します

パッケージとインポートの公式の解説は以下を参考
https://docs.scala-lang.org/ja/tour/packages-and-imports.html

javax.inject._

ファイル文中で扱うアノテーション@~を使うためにインポートします。_には、それ以下全てインポートという意味があります。Javaをやって最初に使ったアノテーションは、オーバーライドアノテーションです@Override:継承したクラスにあるメソッドを再定義する際に、関数の前に記述します。

このファイルのアノテーションの役割は以下です

アノテーション 役割
@Singleton DI(Dependency Injection)登録※1のためのアノテーション。シングルトン※2で生成される
@Inject DI登録したクラスのインスタンスを、文字通り「注入する」ためのアノテーション

※1 依存性の注入。コンポーネント間の依存関係をプログラムのソースコードから排除するために、外部の設定ファイルなどでオブジェクトを注入できるようにするソフトウェアパターン。よくDIと呼ばれる
※2 あるクラスのインスタンスを1つしか作成しないデザインパターンのこと。 再度インスタンスを呼ぶメソッドを実行した場合、最初に作成したインスタンスが返る。 作成する際に、コンストラクタのアクセス修飾子をprivateにして外部からnewできないようにする。

@Inject()(val controllerComponents: ControllerComponents)

Play frameworkでデフォルトでDI登録されているControllerComponentsを注入している。

def index() = Action {}

Actionnは、play.api.mvcの中に入っています。Play frameworkは基本的にきたリクエストは、このActionが処理する

Ok(views.html.index())

ContentType text/plain のレスポンスボディを含む、 ステータス 200 OK のレスポンスを生成。
この際のレスポンスボディは、viewsパッケージにあるindexのhtml

詳しくは以下公式を参考
https://www.playframework.com/documentation/ja/2.3.x/ScalaActions

Discussion