我正在开发一个播放应用程序,我想覆盖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))
}
答案 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
}
}