覆盖Play资产的反向路由器

时间:2014-06-30 10:04:09

标签: playframework-2.0

我正在开发一个播放应用程序,我想覆盖Reverse Asset controller。考虑page.scala.html中的以下代码:

<link rel="stylesheet" href='@controllers.routes.Assets.at("stylesheet/main.css")'>

我想覆盖反向资产控制器以从不同的主机提供服务,这样当在模板中使用上述内容时,覆盖将执行以下操作:

// read the "staticHost" environment variable, default to empty string
val staticHost = scala.util.Properties.envOrElse("staticHost","")

// if not set, then use the default reverse controller. else use the defined host
if (staticHost.isEmpty)
  super.at(file)
else
  staticHost + file

这有可能吗?

解决方案

我使用了一种模仿反向路由器行为的自定义方法:

def reverseAt(file: String): Call = {
  val prefix = if (basepath.isEmpty) _prefix + { _defaultPrefix } + "assets/" else basepath

  (file: @unchecked) match {
    case (file) if file == "robots.txt" => Call("GET", prefix + "robots.txt")
    case (file) if true => Call("GET", prefix + implicitly[PathBindable[String]].unbind("file", file))

}

1 个答案:

答案 0 :(得分:2)

由于您实际上不会对远程主机进行任何路由(即,不提供实际响应),因此没有任何理由可以使用路由控制器。您可以创建一个与反向资产路由器完全相同的辅助对象,并在必要时调用实际的反向资产路由器。

object Assets {
    val staticHost = scala.util.Properties.envOrElse("staticHost","")

    def at(path: String): String = {
        if (staticHost.isEmpty)
            controllers.routes.Assets.at(file).url
        else
            staticHost + file
    }

}