2012-08-09 12 views
5

Una parte de mi aplicación estará disponible como API, por lo que algunas de mis páginas deben estar disponibles en JSON o XML (según el encabezado Aceptar 'Tipo de contenido').Symfony2 + FOSRestBundle: ¿Habilita/deshabilita la funcionalidad REST por controlador/acción?

He utilizado el FOSRestBundle y funciona muy bien, pero ahora TODAS mis páginas están disponibles en XML (o JSON) al enviar Aceptar encabezado 'Tipo de contenido: application/xml'.

Por lo tanto, me gustaría habilitar/deshabilitar esta funcionalidad para algunos de mis controladores/acciones. Sería ideal hacerlo con anotaciones.

¿Es esto posible?

Mi config.yml:

fos_rest: 
    view: 
     formats: 
      rss: false 
      xml: true 
      json: true 
     templating_formats: 
      html: true 
     force_redirects: 
      html: false 
     failed_validation: HTTP_BAD_REQUEST 
     default_engine: twig 
     view_response_listener: force 
    body_listener: 
     decoders: 
      json: acme.decoder.json 
      xml: fos_rest.decoder.xml 
    format_listener: 
     default_priorities: ['html', 'xml', 'json', '*/*'] 
     fallback_format: html 
     prefer_extension: false  

Respuesta

6

Según the RestBundle's documentation, no obtendrá una salida XML si no se utiliza un View en su controlador. Por lo tanto, si no utiliza la anotación @View, o View::create() en su acción, y devuelve una respuesta clásica, obtendrá un resultado HTML.

Si desea forzar el formato por algunas razones, se puede girar el prefer_extension a true y ajustar la definición de enrutamiento:

my_route: 
    pattern: /my-route 
    defaults: { _controller: AcmeDemoBundle:action, _format: <format> } 

Dónde <format> es el formato que desee a la fuerza.

2

Puede establecer view_response_listener en false (el valor predeterminado es force). Y luego agregue la anotación @View a cada una de sus clases de controlador, donde desea usar REST.

El ejemplo lo hará más claro.

Una controladora sin descanso:

/** 
* @Route("/comments") 
*/ 
class CommentsControler extends Controller 
{ 
    /** 
    * @Route("/") 
    * @Method({"POST"}) 
    */ 
    public function newAction() { ... } 

    /** 
    * @Route("/{id}") 
    */ 
    public function detailAction($id) { ... } 

    ... 
} 

Y otro controlador con el descanso. Tenga en cuenta que solo se requiere la anotación @View para la clase (a menos que desee anular el código de estado de la respuesta).

/** 
* @View 
* @Route("/api/comments") 
*/ 
class RestfulCommentsControler extends Controller 
{ 
    /** 
    * @Route("/") 
    * @Method({"POST"}) 
    */ 
    public function newAction() { ... } 

    /** 
    * @Route("/{id}") 
    */ 
    public function detailAction($id) { ... } 

    /** 
    * @View(statusCode=204) 
    * @Route("/{id}/delete") 
    */ 
    public function deleteAction($id) { ... } 

    ... 
} 
  • View es FOS\RestBundle\Controller\Annotations\View
  • Route es Symfony\Component\Routing\Annotation\Route
+1

suena bien, pero no parece funcionar. –

+0

Funciona para mí. ¿Estás usando la clase correcta de anotación 'View'? ¿Puedes proporcionar más información? –

+1

Si 'usa FOS \ RestBundle \ Controller \ Annotations como Rest;', sus anotaciones deben ser '@Rest \ View' en lugar de' @ View' – alexismorin

Cuestiones relacionadas