Как работать с разными форматами вывода в шаблонах
Как работать с разными форматами вывода в шаблонах
Шаблоны - это общий способ отобразить содержание в любом формате. В то время, как в большинстве случаев вы будете использовать шаблоны для отображения 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
- PHP
1 2 3
<a href="{{ path('article_show', {'slug': 'about-us', '_format': 'xml'}) }}">
View as XML
</a>
See also
Для более детальной информации, смотрите Продвинутый пример маршрутизации .
Tip
При построении API, использование расширений имён файлов зачастую является не лучшим решением. FOSRestBundle предоставляет слушателя запросов, который использует согласование содержания. Чтобы узнать больше, смотрите документацию пакета Слушатель формата запроса.