Как работать с разными форматами вывода в шаблонах

Как работать с разными форматами вывода в шаблонах

Шаблоны - это общий способ отобразить содержание в любом формате. В то время, как в большинстве случаев вы будете использовать шаблоны для отображения HTML-содержания, шаблон может так же просто генерировать Java-скрипт, CSS, XML или любой другой формат ваших мечтаний.

Например, один и тот же "ресурс" часто отображается в нескольких форматах. Чтобы отобразить главную страницу статьи в XML, просто включите формат в имя шаблона:

  • XML имя шаблона: article/show.xml.twig
  • XML имя файла шаблона: show.xml.twig

В действительности, это не более, чем соглашение по именованию, и шаблон на самом деле не отображается по-разному, в зависимости от формата.

Во многих случаях вам может захотеть позволить одному контроллеру отображать множество разных форматов, основываясь на "формате запроса". По этой причине, общим шаблоном действий будет следующее:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
// ...
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;

class ArticleController extends Controller
{
    /**
     * @Route("/{slug}")
     */
    public function showAction(Request $request, $slug)
    {
        // вернуть статью, основываясь на $slug
        $article = ...;

        $format = $request->getRequestFormat();

        return $this->render('article/show.'.$format.'.twig', array(
            'article' => $article,
        ));
    }
}

getRequestFormat() в объекте Request по умолчанию имеет значение html, но может возвращать любой другой формат, основываясь на формате, запрошенном пользователем. Формат запроса чаще всего определяется маршрутизацией, где маршрут может быть сконфигурировать так, чтобы /about-us устанавливал формат запроса html, в то время как /about-us.xml устанавливал формат xml. Этого можно достичь используя специальный заполнитель _format в определении вашего маршрута:

1
2
3
4
5
6
7
/**
 * @Route("/{slug}.{_format}", defaults={"_format": "html"})
 */
public function showAction(Request $request, $slug)
{
    // ...
}

Теперь включите заполнитель _format при генерировании маршрута для другого формата:

  • Twig
    1
    2
    3
    <a href="{{ path('article_show', {'slug': 'about-us', '_format': 'xml'}) }}">
        View as XML
    </a>
    
  • PHP
    1
    2
    3
    4
    5
    6
    7
    8
    <!-- The path() method was introduced in Symfony 2.8. Prior to 2.8, you
         had to use generate(). -->
    <a href="<?php echo $view['router']->path('article_show', array(
        'slug' => 'about-us',
        '_format' => 'xml',
    )) ?>">
        View as XML
    </a>
    
Для более детальной информации, смотрите Продвинутый пример маршрутизации.

Tip

При построении API, использование расширений имён файлов зачастую является не лучшим решением. FOSRestBundle предоставляет слушателя запросов, который использует согласование содержания. Чтобы узнать больше, смотрите документацию пакета Слушатель формата запроса.

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