Play 2.0应用程序和使用过的插件都有“Global”对象

时间:2014-04-04 09:41:51

标签: scala playframework playframework-2.0 scala-2.10

我已经编写了一个Play 2.0插件,可以将所有传入的请求重定向到特定的控制器。我们需要这个用于模板开发和测试。为了达到这个目的,我的插件有一个看起来像这样的全局对象:

object Global extends GlobalSettings {

  override def onRouteRequest(request: RequestHeader): Option[Handler] = {

    Play.application.plugin(classOf[MyPlugin]) match {
      case Some(plugin) => plugin.enabled() match {
        case true => Some(MyController.action)
      }
      case None => super.onRouteRequest(request)
    }

  }

}

此解决方案存在的问题是,我无法在主应用程序中向onRouteRequest添加其他逻辑。

  1. 是否有另一种方法可以在插件中实现此目的,然后使用onRouteRequest
  2. 或者只有在插件启用时才能加载onRouteRequest插件逻辑?
  3. 或者是否有另一种方法可以使用onRouteRequest两个全局对象?
  4. 感谢您的帮助

    托本

1 个答案:

答案 0 :(得分:2)

插件永远不应该为应用程序定义Global

改为定义过滤器,并让应用程序在其过滤器中包含该过滤器:

object MyFilter extends EssentialFilter {
  def apply(next: RequestHeader => EssentialAction) = EssentialAction { request =>
    Play.application.plugin(classOf[MyPlugin]) match {
      case Some(plugin) if plugin.enabled() {
        MyController.action(request)
      case _ =>
        next(request)
    }
  }
}