Symfony 2.3, el libro oficial

7.13. Formato de plantillas

Las plantillas pueden generar contenidos en cualquier otro formato. Aunque casi siempre se utilizan las plantillas para generar contenido HTML, también puedes generar fácilmente código JavaScript, CSS, XML o cualquier otro formato similar.

Resulta habitual por ejemplo generar el mismo contenido en varios formatos diferentes. Para renderizar la página de índice en formato XML, basta con incluir este formato en el nombre de la plantilla:

  • Nombre de la plantilla XML: AcmeArticleBundle:Article:index.xml.twig
  • Nombre del archivo de la plantilla XML: index.xml.twig

Obviamente esto no es más que una convención para nombrar a las plantillas. Añadir la extensión xml no hace que la plantilla genere automáticamente contenidos en formato XML. En cualquier caso, sí que es común que un mismo controlador responda en formatos muy diferentes, para lo cual puedes utilizar el siguiente código:

public function indexAction()
{
    $format = $this->getRequest()->getRequestFormat();

    return $this->render('AcmeBlogBundle:Blog:index.'.$format.'.twig');
}

El método getRequestFormat del objeto Request devuelve el formato solicitado por el usuario en su petición, y por defecto vale HTML. El formato de la petición normalmente se gestiona a nivel del enrutamiento, de manera que la ruta /contact por ejemplo establezca el formato a html y la ruta /contact.xml lo establezca a xml.

Para generar enlaces que incluyan el formato del contenido, utiliza la variable especial _format (con el guión bajo por delante):

<a href="{{ path('article_show', {'id': 123, '_format': 'pdf'}) }}">
    PDF Version
</a>
<a href="<?php echo $view['router']->generate('article_show', array(
    'id' => 123,
    '_format' => 'pdf',
)) ?>">
    PDF Version
</a>