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

How to retrieve values from a context in Vapor?

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

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

我不想每次使用时都将当前路径传递给标签,所以我将请求的路径存储在上下文中,大致如下(省略检查):

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

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

我的自定义标签派生自 Tag,它的 run 方法接收上下文作为参数,我可以在调试器中看到存储的值——但我如何获得在吗? Contextclass中的get方法,好像是做这个的,是internal,所以不能用。有评论说要做下标,我假设这最终将是从上下文中提取值的方法,但与此同时,有什么方法可以检索它们吗?

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

水滴路线:

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 内容的访问 publicly。但是,由于 queue: List<Node>() 是 public,您只需将 get() 函数复制到您自己的扩展程序中,然后您就可以按照您的意愿进行操作了。