以编程方式在Play2.0中添加路由

时间:2012-04-12 01:34:16

标签: playframework-2.0

在1.2.X中我们可以做到

Router.addRoute("GET", "/somePath", "controller.methodName");

我正在编写一个模块,添加一个“路由”,由模块中的控制器处理。它是一个OAuth处理程序,希望让用户不必处理OAuth握手等。

如何在Play 2.0中执行此操作?

4 个答案:

答案 0 :(得分:9)

您无法以编程方式添加到Routes对象,但您可以通过覆盖GlobalSettings.onRouteRequest拦截Web请求并自行处理它们。例如:

override def onRouteRequest(request: RequestHeader): Option[Handler] = {
  //do our own path matching first - otherwise pass it onto play.
  request.path match {
    case "/injectedRoute" => Some(controllers.Application.customRoute)
    case _ => Play.maybeApplication.flatMap(_.routes.flatMap {
      router =>
      router.handlerFor(request)
    })
  }
}

我不知道这是否是推荐的方法,但它对我有用。这是github上的一个示例:https://github.com/edeustace/play-injected-routes-example

答案 1 :(得分:3)

我不确定你能不能。

Play 2.0的概念是专注于类型安全,其中包括路径文件。现在编译路由文件,而不是在运行时解释。如果查看routes文件的代码,它会从routes文件本身生成一个scala类。因此,只会忽略运行时操作。

不幸的是,看起来您的路由必须在routes文件中定义,除非您愿意拦截http请求以自行检查特定路由,这是/ {documentation链接在{{3 scala类。

另请参阅此错误帖子ApplicationProvider

答案 2 :(得分:3)

您可以在路线文件中添加通用路线(在文件末尾,因为其优先级将根据其声明位置进行评估)

GET     /:page  controllers.Application.showPage(page)

将您想要在运行时执行的逻辑放在控制器类

public static Result showPage(String page){

    if(page.contains("abc"){
      .....
    } else {
      //return 404
    }
}

我不确定它是否符合您的要求,但在大多数情况下它都足够了。

答案 3 :(得分:-9)

*的 play2.0 * * 在路线文件中添加此行 * GET / somePath controller.methodName()