什么是对范围routes
的文件找implicit
好像PathBindable
还是QueryStringBindable
?
对于自定义类型,只需在伴随对象中定义它们就像下面这样简单:
case class Foo(data: String) object Foo { implicit val pathBinder: PathBindable[Foo] = ??? }
但是,对于现有类型,routes
由于我们不能import
在此处执行任何自定义,因此不清楚在文件中声明隐式的位置.
那么,路由文件的含义范围是什么?
这并没有直接回答这个问题,但似乎相关......
您可以routes
通过添加到routesImport
您的密钥中的自定义导入build.sbt
例如:
import play.PlayImport.PlayKeys._ routesImport += "my.custom.package.Foo._"
该片段是从我刚才写的一篇名为Using Play-Framework的PathBindable的博客文章中借来的
我们有一个需要使用的queryStringBindable,并且有类似的情况,我们发现了这个问题,这给了我们一个线索,但colinjwebb的答案已经过时了。
这是我们的示例,它从字符串到Option [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._" )