Воспроизвести 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 не раскрывает ничего, кроме нескольких вопросов по одной теме без разрешения. Любые идеи?
Обновление: похоже, что это несколько связано с этим вопросом.
Ответы
Ответ 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._");