如何从Vapor中的上下文中检索值?

时间:2016-11-07 17:01:42

标签: vapor leaf

在Vapor中,特别是在自定义Leaf标记的类中,如何检索存储在上下文中的值?

我正在尝试实现一个带有字符串和路径的标记,并呈现一个链接,除非该路径是当前页面,因此,例如,#navElement("About Us", "/about")将生成一个指向该网站的链接在除页面本身之外的每个页面上。在该页面上,它应该显示没有链接的文本。

我不想每次使用它时都必须将当前路径传递给标记,所以我在上下文中存储了请求的路径,大致类似于这样(检查省略):

drop.get(":page"){ request in
  return try drop.view.make(thePage, ["path": request.uri.path])
}

我可以在模板中使用#(path)并查看我期望的路径。

我的自定义标记派生自Tag,其run方法接收上下文作为参数,我可以在调试器中看到存储的值 - 但我如何获取它? get类中的Context方法似乎是internal,因此我无法使用它。有一条评论说要完成下标,我认为这最终将是从上下文中提取值的方法,但与此同时,有没有办法检索它们?

1 个答案:

答案 0 :(得分:0)

只需将当前path作为标记的参数之一。

Droplet route:

drop.get(":page") { request in
  return try drop.view.make(thePage, ["currentPath": request.uri.path])
}

在模板中:

#navElement("About Us", "/about", currentPath)

标签:

class NavElement: Tag {

  let name = "navElement"

  public func run(stem: Stem, context: LeafContext, tagTemplate: TagTemplate, arguments: [Argument]) throws -> Node? {
    guard
      let linkText = arguments[0].value?.string,
      let linkPath = arguments[1].value?.string,
      let currentPath = arguments[2].value?.string
    else { return nil }
    if linkPath == currentPath {
      return Node("We are at \(currentPath)")
    } else {
      return Node("Link \(linkText) to \(linkPath)")
    }
  }

}

编辑:

我已经与Vapor的开发人员交谈过,他们并不打算公开访问Context的内容。但是,由于queue: List<Node>()是公开的,您只需将get()功能复制到您自己的扩展程序中,然后您就可以按照自己的意愿进行操作。