如何从 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
方法接收上下文作为参数,我可以在调试器中看到存储的值——但我如何获得在吗? Context
class中的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()
函数复制到您自己的扩展程序中,然后您就可以按照您的意愿进行操作了。
在 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
方法接收上下文作为参数,我可以在调试器中看到存储的值——但我如何获得在吗? Context
class中的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()
函数复制到您自己的扩展程序中,然后您就可以按照您的意愿进行操作了。