Symfony2: Response, ResponseRedirect, JsonResponse y StreamedResponse

Symfony2 es un framework de petición/respuesta, la idea principal es que una petición se convierta en una respuesta, para ello disponemos de las clases Request y Response que proporciona el componente HttpFoundation. Este componente reemplaza las variables globales de PHP ($_POST, $_GET, $_FILE, etc) y algunas funciones por una capa orientada a objetos. Vamos a centrarnos en la clase Response y sus subclases.

Response

Esta es la respuesta básica, recibe como parámetros el contenido, el código de estado y las cabeceras de la respuesta:

Por defecto el contenido es un string vacío, el código de estado es 200 y los headers es un array vacío.

RedirectResponse

Esta respuesta se usa para cuando queremos redireccionar a una url:

En este caso el contenido no es necesario y recibe como parámetros la url, el código de estado que por defecto es 302 y los headers. Este tipo de respuesta le añade la cabecera Location automáticamente y comprueba que el código de estado sea de redirección.

Esta respuesta es la que usa el método redirect de la clase Controller del FrameworkBundle de la que normalmente se extienden los controllers que creamos:

JsonResponse

Nuevo en Symfony2.1

Devolver un JSON como respuesta es algo bastante común y se puede hacer así:

En la versión 2.1 existe la clase JsonResponse para hacerlo aún más fácil:

El método setData llama internamente a json_encode pasándole los datos y añade el Content-Type correspondiente, también se le puede pasar el array de datos como primer parámetro al constructor, además si estás usando JSONP esta clase tiene un método llamado setCallback para pasarle el callback:

Esto hará que el Content-Type sea text/javascript y la salida será:

StreamedResponse

Nuevo en Symfony2.1

Esta clase permite enviar la respuesta mediante streaming, el contenido de la respuesta es una función callable en vez de un string:

BinaryFileResponse

Nuevo en Symfony2.2

En la nueva versión se ha añadido la clase BinaryFileResponse para enviar ficheros, pero ya la veremos cuando veamos los novedades de la versión 2.2

Ejemplos

Para probar todo esto vamos a crear 5 acciones en un nuevo controlador llamado ResponseController:

Como lo que devuelven son respuestas sin renderizar ninguna plantilla, no se va a poder ver el código que se ha ejecutado como en toda la aplicación, por lo que mostraremos el código que se va a ejecutar al debajo de los enlaces.

Ver Demo