Подтвердить что ты не робот

Воспроизвести 2,0 доступ к запросу в шаблонах

У меня есть следующая упрощенная настройка шаблона:

  • Главная (шаблон)
    • Главная
    • Подробнее

Теперь, когда пользователь входит в систему, атрибут сеанса username устанавливается так, чтобы я мог выяснить, вошел ли пользователь в систему или нет. Чтобы помочь мне выяснить, зарегистрирован ли пользователь или нет, у меня есть следующий вспомогательный объект сеанса:

object SessionHelper {
  val sessionKey = "username"

  def authenticated(implicit request: RequestHeader) = {
    request.session.get(sessionKey).exists(_ => true)
  }
}

Что я могу использовать в шаблоне, который принимает объект запроса implicit, например:

(implicit request: play.api.mvc.RequestHeader)
...
@if(SessionHelper.authenticated) {
    <strong>Authenticated!</strong>
}
...

Так как — насколько я могу судить; это единственный способ получить неявную переменную в шаблоне, это означает, что везде, где я визуализирую представление, мне нужно явно "определить" неявную переменную запроса. Например:

def index = Action { implicit request =>
  Ok(views.html.index(myStuff))
}

Без оператора implicit request => он не компилируется. Теперь, пока это немного неудобно, пока я остаюсь в любом из "под-представлений" (например, "Домашняя страница или детали" ), которые прекрасны, потому что для каждого из этих представлений у меня есть метод контроллера и, как таковой, также доступ к неявным RequestHeader экземпляр. Однако, когда мне нужно получить доступ к сеансу в моем шаблоне (например, Main), это не работает, потому что он никогда явно не отображается контроллером.

Я не сразу вижу способ получить доступ к сеансу в шаблоне, и быстрый Google не раскрывает ничего, кроме нескольких вопросов по одной теме без разрешения. Любые идеи?

Обновление: похоже, что это несколько связано с этим вопросом.

4b9b3361

Ответ 1

Нет альтернативы передаче неявного запроса по всем вашим шаблонам, по крайней мере, не по сравнению с Play Framework 2.0.

Ссылка, которую вы добавляете в обновление, состоит в перемещении большего количества данных вокруг шаблонов всего за 1 объект, но вам все равно нужно объявлять неявный параметр во всем мире.

Ответ 2

Я заметил интересную вещь: в моем приложении Java Play 2.1.0 я могу использовать неявные объекты, перечисленные в Play 1.2.5 documentation, в то время как они вообще не задокументированы в игре 2! Вероятно, это что-то вроде недокументированной исправления обратной совместимости. Во всяком случае, я могу это сделать:

<li @if(request.uri == routes.Help.index.url){class="active"}>

и это:

@for( (key, message) <- flash) { ... }

Как вы можете видеть, я могу использовать переменные request и flash, не определяя их. Мой IntelliJ постоянно подчеркивает его как ошибку, но он компилируется и работает в любом случае. Таким образом, кажется, что несколько версий после 2.0 они решили эту проблему.

Ответ 3

Если вы используете Play для Java, вы можете сделать что-то следующее:

<li @if(requestHeader.uri == routes.Help.index.url){class="active"}>

Просто игнорируйте ошибку в идее, она компилируется и работает хорошо.

Метод requestHeader автоматически импортировался классом play.TemplateImports:

javaImports.add("play.core.j.PlayMagicForJava._");