如何在 Play Framework 路由文件中使用 imports 和 implicits?
How to use imports and implicits in Play Framework's routes file?
routes
文件查找 implicit
的范围是什么,例如 PathBindable
或 QueryStringBindable
?
对于自定义类型,简单地在伴随对象中定义它们很简单,如下所示:
case class Foo(data: String)
object Foo {
implicit val pathBinder: PathBindable[Foo] = ???
}
但是,对于现有类型,尚不清楚在何处声明隐式文件以供 routes
文件找到,因为我们无法在此处进行任何自定义 import
。
那么,路由文件的隐含范围是什么?
这并没有直接回答问题,但似乎相关...
您可以通过添加到 build.sbt
中的 routesImport
键来在 routes
文件中包含自定义导入
例如:
import play.PlayImport.PlayKeys._
routesImport += "my.custom.package.Foo._"
该片段是从博客中借用的 post 我前一段时间写的标题为 Using Play-Framework's PathBindable
我们有一个我们需要使用的 queryStringBindable 并且遇到了类似的情况,我们发现这个问题给了我们一个线索,但是 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._"
)
routes
文件查找 implicit
的范围是什么,例如 PathBindable
或 QueryStringBindable
?
对于自定义类型,简单地在伴随对象中定义它们很简单,如下所示:
case class Foo(data: String)
object Foo {
implicit val pathBinder: PathBindable[Foo] = ???
}
但是,对于现有类型,尚不清楚在何处声明隐式文件以供 routes
文件找到,因为我们无法在此处进行任何自定义 import
。
那么,路由文件的隐含范围是什么?
这并没有直接回答问题,但似乎相关...
您可以通过添加到 build.sbt
routesImport
键来在 routes
文件中包含自定义导入
例如:
import play.PlayImport.PlayKeys._
routesImport += "my.custom.package.Foo._"
该片段是从博客中借用的 post 我前一段时间写的标题为 Using Play-Framework's PathBindable
我们有一个我们需要使用的 queryStringBindable 并且遇到了类似的情况,我们发现这个问题给了我们一个线索,但是 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._"
)