2015-12-31 2 views
2

Что такое область для routes файл, чтобы найти implicit s нравится PathBindable или QueryStringBindable?Как использовать импорт и импликации в файле маршрутов Play Framework?

Для пользовательских типов, это тривиально просто определить их в объекте компаньона, как в следующем:

case class Foo(data: String) 
object Foo { 
    implicit val pathBinder: PathBindable[Foo] = ??? 
} 

Однако для существующих типов, то неясно, где объявить неявным быть найденным routes файла, так как мы не можем сделать любой пользовательский import здесь.

Итак, В чем заключаются ограничения на файл маршрутов?

ответ

5

Это не прямо ответить на вопрос, но мне кажется уместным ...

Вы можете включать в себя пользовательские импорта в файле routes путем добавления к routesImport ключа в вашем build.sbt

Например:

import play.PlayImport.PlayKeys._ 

routesImport += "my.custom.package.Foo._" 

Этот фрагмент кода заимствована из блоге я написал некоторое время назад под названием Using Play-Framework's PathBindable

+0

Я знал, что будет что-то вроде этого! Спасибо и с новым годом:] –

+0

для того, чтобы получить ключ 'routesImport', мне пришлось импортировать' play.sbt.routes.RoutesKeys.routesImport' –

3

у нас был запросStringBindable, который нам нужно использовать и имел подобную ситуацию, мы нашли этот вопрос, который дал нам ключ, но ответ от colinjwebb устарел.

Вот наш пример, который идет от строки к опции [LoginContext].

package controllers 

import play.api.mvc.{Action, AnyContent, QueryStringBindable, Request} 
... 

object BindableLoginContext { 

    implicit def queryStringBindable(implicit stringBinder: QueryStringBindable[String]) = new QueryStringBindable[LoginContext] { 
    override def bind(key: String, params: Map[String, Seq[String]]): Option[Either[String, LoginContext]] = 
     for { 
     loginContextString <- stringBinder.bind(key, params) 
     } yield { 
     loginContextString match { 
      case Right(value) if value.toLowerCase == "web" => Right(LoginContexts.Web) 
      case Right(value) if value.toLowerCase == "api" => Right(LoginContexts.Api) 
      case _ => Left(s"Unable to bind a loginContext from $key") 
     } 
     } 

    override def unbind(key: String, loginContext: LoginContext): String = stringBinder.unbind(key, loginContext.toString) 
    } 
} 

Чтобы использовать его, нам необходимо использовать следующий импорт:

import play.sbt.routes.RoutesKeys 

, а затем добавить объект в проект, как этот

lazy val microservice = Project(appName, file(".")) 
    .settings(
    RoutesKeys.routesImport += "controllers.BindableLoginContext._" 
)