Как получить значения из контекста в Vapor?

Как в Vapor, особенно в классе для настраиваемого тега Leaf, получить значения, хранящиеся в контексте?

Я пытаюсь реализовать тег, который принимает строку и путь и отображает ссылку, если путь не является текущей страницей, поэтому, например, #navElement("About Us", "/about") создаст ссылку на страницу about сайта на каждой странице, кроме страницы about сам. На этой странице он должен отображать текст без ссылки.

Я не хочу передавать текущий путь к тегу каждый раз, когда я его использую, поэтому я сохранил путь запроса в контексте примерно так (проверки опущены):

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

Я могу использовать #(path) в шаблоне и видеть ожидаемый путь.

Мой настраиваемый тег является производным от Tag, а его метод run получает контекст в качестве аргумента, и я могу видеть сохраненное значение там в отладчике, но как мне это получить? Метод get в классе Context, который, кажется, делает это, - это internal, поэтому я не могу его использовать. Есть комментарий, в котором говорится, что индексы должны быть выполнены, и я предполагаю, что в конечном итоге это будет способ извлечения значений из контекста, но пока есть ли способ их получить?


person MacAvon    schedule 07.11.2016    source источник


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

person tobygriffin    schedule 07.11.2016
comment
Спасибо, но я стараюсь не повторять этот аргумент каждый раз, когда использую тег, и, поскольку у меня уже есть контекст в методе run, я надеялся, что смогу извлечь путь оттуда. - person MacAvon; 08.11.2016
comment
Спасибо, что узнали об этом. Кажется странным решение, когда они передают контекст run, но я не могу объяснить, почему. Предлагаемый обходной путь помогает мне. - person MacAvon; 09.11.2016