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

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

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

  • YAML
    1
    2
    3
    4
    5
    acme_privacy:
        path: /privacy
        defaults:
            _controller: FrameworkBundle:Template:template
            template:    static/privacy.html.twig
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    <?xml version="1.0" encoding="UTF-8" ?>
    <routes xmlns="http://symfony.com/schema/routing"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
    
        <route id="acme_privacy" path="/privacy">
            <default key="_controller">FrameworkBundle:Template:template</default>
            <default key="template">static/privacy.html.twig</default>
        </route>
    </routes>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    use Symfony\Component\Routing\RouteCollection;
    use Symfony\Component\Routing\Route;
    
    $collection = new RouteCollection();
    $collection->add('acme_privacy', new Route('/privacy', array(
        '_controller' => 'FrameworkBundle:Template:template',
        'template'    => 'static/privacy.html.twig',
    )));
    
    return $collection;
    

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

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

  • Twig
    1
    {{ render(url('acme_privacy')) }}
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    <?php
    use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
    ?>
    
    <!-- Метод url() был представлен в Symfony 2.8. До версии 2.8, вам
         нужно было использовать generate() с UrlGeneratorInterface::ABSOLUTE_URL,
         переданным в качестве третьего аргумента. -->
    <?php echo $view['actions']->render(
        $view['router']->url('acme_privacy', array())
    ) ?>
    

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

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

  • YAML
    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
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8" ?>
    <routes xmlns="http://symfony.com/schema/routing"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
    
        <route id="acme_privacy" path="/privacy">
            <default key="_controller">FrameworkBundle:Template:template</default>
            <default key="template">static/privacy.html.twig</default>
            <default key="maxAge">86400</default>
            <default key="sharedAge">86400</default>
        </route>
    </routes>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    use Symfony\Component\Routing\RouteCollection;
    use Symfony\Component\Routing\Route;
    
    $collection = new RouteCollection();
    $collection->add('acme_privacy', new Route('/privacy', array(
        '_controller' => 'FrameworkBundle:Template:template',
        'template'    => 'static/privacy.html.twig',
        'maxAge'      => 86400,
        'sharedAge'   => 86400,
    )));
    
    return $collection;
    

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

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

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.