Play에서 쿼리 문자열을 case class (자신 유형, 모든 객체)로 수신

QueryStringBindable의 이야기입니다.
배열로 받는 기사를 쓸 때의 조사 것 중에서의 생각으로.
- Play에서 쿼리 문자열을 배열 (List) 또는 모든 유형으로받습니다.

소스 코드



만든 소스의 동작 사양적인 것



다음과 같은 쿼리에서 Cells 객체에 바인딩합니다.

쿼리 문자열


?cells.colums=4&cells.rows=5

셀 정의



Cells.scala
case class Cells(columns: Int, rows: Int)

그리기



받은 셀의 열을 열, 행을 행으로 '■'를 그립니다.
  • 3×4
  • 2×5

  • 소스 코드의 포인트 발췌



    QueryStringBindable의 확장 부분



    Cells.scala
    object Cells {
      implicit def queryStringBinder(implicit intBinder: QueryStringBindable[Int]) = new QueryStringBindable[Cells] {
        val columnsKey = "columns"
        val rowsKey = "rows"
    
        override def bind(key: String, params: Map[String, Seq[String]]): Option[Either[String, Cells]] = {
          for {
            columns <- intBinder.bind(s"$key.$columnsKey", params)
            rows <- intBinder.bind(s"$key.$rowsKey", params)
          } yield {
            (columns, rows) match {
              case (Right(c), Right(r)) => Right(Cells(c, r))
              case _ => Left(s"cell's columns and rows must be Integer.")
            }
          }
        }
    
        override def unbind(key: String, cells: Cells): String = s"${intBinder.unbind(s"$key.$columnsKey", cells.columns)}&${intBinder.unbind(s"$key.$rowsKey", cells.rows)}"
      }
    }
    

    포인트


  • Int의 bind, unbind에는 기존의 구현을 이용
  • 에러 처리는 간단하기 위해 정리하고 있지만, 세세한 제어도 가능
  • Left로 돌려준 것은 어디에 간다? (향후 조사하겠습니다)

  • routes


    GET     /                           controllers.TestController.index(cells: controllers.request.query.Cells)
    
  • Cells의 컴패니언 객체에 QueryStringBindable 확장을 정의하면 routes에 쓸 수 있습니다.

    감상·비고 등


  • 이번 사양이라면 오브젝트로 할 필요가 없다는 츳코미는 없이. . .
  • 「행렬」이므로 Cells의 columns와 rows의 순서는 반대쪽이 좋다고 나중에 생각했습니다. . .
    본질적인 내용이 아니기 때문에 이번에는 수정하지 않고. . .

  • 참고로 한 것



    Play 2.x QueryStringBindable, PathBindable 정보
    공식 문서 -

    좋은 웹페이지 즐겨찾기