Как извлечь значения из контекста в 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() включите свое собственное расширение, и тогда вы сможете делать то, что хотели.

Другие вопросы по тегам