我正在寻找一种方法来为html模板的所有反向路由添加前缀,而不必将它们全部包含在函数应用程序中。我计划使用html基本标记,但反向路由都以斜杠开头,因此相对于基本标记的主机而不是完整的URL。对于更强大的解决方案,我可能缺少任何功能吗?
答案 0 :(得分:3)
routes
重命名为context.routes
routes
文件添加到routes
行:
-> /context context.Routes
答案 1 :(得分:1)
要完成这样的事情,以便以干燥的方式与我的应用程序自己的URL进行通信,通过内部链接传播查询参数调试设置,以及我发现Play&#39 ; s反向路由器非常难看,我创建了一个我更喜欢的URL抽象。它的工作原理如下:
1)我创建了一个代表URL的类型:
/** Represents a URL that can possibly be a webpage */
sealed trait PageUrl
case class SectionUrl(slug: String) extends PageUrl
case class StaticPageUrl(slug: String) extends PageUrl
case class ExternalUrl(url: String) extends PageUrl
2)我创建了一个用于将这些对象解析为完整URL的类:
/** Wrapper to propagate request override flags to internal links */
case class UrlWrapper(params: Seq[(String, String)]) {
def apply(url: PageUrl, additionalParams: Seq[(String, String)] = Seq.empty): String = {
url match {
case SectionUrl(slug) => urlAndParams(routes.PageRendererController.showSectionPage(slug).url)
case StaticPageUrl(slug) => urlAndParams(routes.PageRendererController.showStaticPage(slug).url)
case ExternalUrl(u) => u
}
}
def urlAndParams(url: String, additionalParams: Seq[(String, String)] = Seq.empty): String = {
def urlEncode = (u: String) => java.net.URLEncoder.encode(u, "UTF-8")
val formattedParams = (queryParams ++ additionalParams).map{ case (key, value) => s"$key=${urlEncode(value)}" }.mkString("&")
val paramOption = if (formattedParams.nonEmpty) Some(formattedParams) else None
(Seq(url) ++ paramOption).mkString(if (url.indexOf("?") > 0) "&" else "?")
}
}
您可以轻松地修改它,以便在默认情况下提供前缀,或者通过其他方法请求。
3)在我的所有视图都扩展的特征/类中,我声明了一个类型为UrlWrapper
的隐式字段,我的模板可以使用它,所以我可以这样做:
@(option1: String, urlParam: PageUrl)(implicit url: UrlWrapper)
...
<a href="@url(urlParam)">My link</a>
...
作为奖励,由于我的网页都与我的应用中的模型相对应,因此我添加了UrlWrapper
其他方法,用于将模型对象转换为已解析的网址:
case class UrlWrapper(...) {
...
def forSection(section: Section, additionalParams: Seq[(String, String)] = Seq.empty): String = {
apply(SectionUrl(section.slug), additionalParams)
}
def forStaticPage(staticPage: StaticPage, additionalParams: Seq[(String, String)] = Seq.empty): String = {
apply(StaticPageUrl(staticPage.slug), additionalParams)
}
}