Как извлечь значения из контекста в Vapor?
В 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 ответ
Просто сделай ток 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 публично. Тем не менее, так как queue: List<Node>()
является публичным, вы можете просто скопировать get()
включите свое собственное расширение, и тогда вы сможете делать то, что хотели.