将前缀添加到反向路由

时间:2014-10-14 09:17:14

标签: scala playframework routes

我正在寻找一种方法来为html模板的所有反向路由添加前缀,而不必将它们全部包含在函数应用程序中。我计划使用html基本标记,但反向路由都以斜杠开头,因此相对于基本标记的主机而不是完整的URL。对于更强大的解决方案,我可能缺少任何功能吗?

2 个答案:

答案 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)
  }
}