Play的路线文件中的导入和条件是否可能?

pat*_*rit 9 scala playframework-2.2

我知道Play的早期版本曾用于支持路由文件中的路由和条件(如果是块),但是我找不到Play 2.2.x和HTTP路由的任何此类文档.

我想替换这个:

GET /api/users/:id com.corporate.project.controllers.UserController.get(id)
Run Code Online (Sandbox Code Playgroud)

使用较短版本使用import如下:

import com.corporate.project.controllers._ 

GET /api/users/:id UserController.get(id)
Run Code Online (Sandbox Code Playgroud)

此外,路由文件中是否可以有条件?例如

if Play.isDev(Play.current())
  GET /displayConfig   DebugController.displayServerConfigs()
Run Code Online (Sandbox Code Playgroud)

小智 5

过去可以通过SBT设置导入包:routesImport += "com.corporate.project.controllers._".不确定是否仍然如此.

此外,路由文件中是否可以有条件?

它可能不是一个理想的解决方案,但我们使用routes标签来处理这种条件路由.您需要一个过滤器来检查路由是否已注释并运行条件逻辑.

路线:

# @devmode
GET /displayConfig   DebugController.displayServerConfigs()
Run Code Online (Sandbox Code Playgroud)

过滤:

object DevmodeRouteFilter extends Filter {

  private val DevmodeAnnotation = "@devmode"

  override def apply(next: RequestHeader => Future[SimpleResult])(request: RequestHeader): Future[SimpleResult] = {
    if(isDevRoute(request) && !Play.isDev(Play.current()) {
      Play.current.global.onHandlerNotFound(request)
    } else {
      next(request)
    }
  }

  private def isDevRoute(request: RequestHeader): Boolean = {
    val comments = request.tags.getOrElse(Routes.ROUTE_COMMENTS, "")
    comments.lines.exists { comment =>
      comment.trim == DevmodeAnnotation
    }
  }

}
Run Code Online (Sandbox Code Playgroud)

不要忘记将过滤器添加到过滤器链中.


ya_*_*ser 2

谢谢你的问题,这是一个有趣的想法,所以我去了 Play2 的源代码,发现在 play.core.Router.scala 中的 Play 2.2.3 的签出中: object HandlerInvoker 将控制器构造为

handlerDef.ref.getClass.getClassLoader.loadClass(handlerDef.controller)
Run Code Online (Sandbox Code Playgroud)

所以我担心 2.2.x 中没有实现对部分类名(存储在 handlerDef.controller 中)的支持。

在 2.3.x 中,提交https://github.com/playframework/playframework/commit/ba98dabd7ba374ed98f14f721835b898d27dd55b 带来了路由的包/命名空间的概念。

请查看该提交中 Routes.scala 和 RoutesCompiler.scala 的更改。

但我在文档中找不到该功能的描述,而且我现在没有 Play 2.3.x 来使用它。

PS:http: //java.dzone.com/articles/advanced-routing-play中描述了 2.3.x 高级路由的示例魔法。