在 play 1.2.X 我们可以做
Router.addRoute("GET", "/somePath", "controller.methodName");
我正在编写一个模块,该模块添加将由模块中的控制器处理的“路由”。它是一个 OAuth 处理程序,希望用户能够轻松地不必处理 OAuth 握手等。
如何在 Play 2.0 中做到这一点?
在 play 1.2.X 我们可以做
Router.addRoute("GET", "/somePath", "controller.methodName");
我正在编写一个模块,该模块添加将由模块中的控制器处理的“路由”。它是一个 OAuth 处理程序,希望用户能够轻松地不必处理 OAuth 握手等。
如何在 Play 2.0 中做到这一点?
您不能以编程方式添加到 Routes 对象,但您可以拦截 Web 请求并自己通过覆盖来处理它们GlobalSettings.onRouteRequest
。例如:
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
我不确定你可以。
Play 2.0 的概念是专注于类型安全,其中包括路由文件。路由文件现在已编译,而不是在运行时解释。如果您查看路由文件的代码,它会从路由文件本身生成一个 scala 类。因此,运行时操作将被简单地忽略。
不幸的是,您的路由似乎必须在路由文件中定义,除非您愿意拦截 http 请求以自己检查特定路由,这就是 /@documentation 链接在ApplicationProvider scala 类中的作用。
另请参阅此错误帖子https://play.lighthouseapp.com/projects/82401/tickets/12-support-multiple-routes-file-and-inclusion
您可以在您的路线文件中添加通用路线(在文件末尾,因为其优先级将根据其声明位置进行评估)
GET /:page controllers.Application.showPage(page)
将要在运行时执行的逻辑放在控制器类中
public static Result showPage(String page){
if(page.contains("abc"){
.....
} else {
//return 404
}
}
我不确定它是否符合您的要求,但在大多数情况下就足够了。
* play2.0 * *在你的路由文件中添加这一行* GET /somePath controller.methodName()