Как отобразить шаблон без пользовательского контроллера

Как отобразить шаблон без пользовательского контроллера

Обычно, когда вам нужно создать страницу, вам нужно создать контроллер и отобразить шаблон изнутри этого контроллера. Но если вы отображаете простой шаблон, который не требует передачи каких-либо данных в него, вы можете полностью избежать создания контроллера, используя встроенный контроллер FrameworkBundle:Template:template.

Например, представьте, что вы хотите отобразить шаблон static/privacy.html.twig, который не требует передачи в него каких-либо переменных. Вы можете сделать это, не создавая контроллер:

1
2
3
4
5
acme_privacy:
    path: /privacy
    defaults:
        _controller: FrameworkBundle:Template:template
        template:    static/privacy.html.twig

Контроллер FrameworkBundle:Template:template просто отобразит любой переданный вами шаблон в качестве значения template по умолчанию.

Конечно же, вы можете также использовать этот фокус при отображении встроенных контроллеров изнутри шаблона. Но так как целью отображения контроллера из шаблона обычно является подготовка некоторых данных в пользовательском контроллере, это наверное полезно только если вы хотите частично кешировать эту страницу (смотрите Как отобразить шаблон без пользовательского контроллера).

1
{{ render(url('acme_privacy')) }}

Кеширование статическго шаблона

Так как шаблоны, отображённые таким способом, обычно статические, может иметь смысл кешировать их. К счастью, это просто! Путём конфигурации нескольких других переменных в вашем маршруте, вы можете точно контролировать, как будет кеширована ваша страница:

1
2
3
4
5
6
7
acme_privacy:
    path: /privacy
    defaults:
        _controller:  FrameworkBundle:Template:template
        template:     'static/privacy.html.twig'
        maxAge:       86400
        sharedAge:    86400

Значения maxAge и sharedAge используются для изменения объекта ответа (Response), созданного в контроллере. Для более детальной информации о кешировании, см. HTTP-кеш.

Также существует переменная private (не показанная здесь). По умолчанию, объект Response будет публичным, если переданы maxAge или sharedAge. Если установлено значение true, Response будет отмечен как приватный.