2012-08-09 10 views
5

Una parte della mia domanda sarà disponibile come API, quindi alcune delle mie pagine devono essere disponibili in JSON o XML (in base all'intestazione Accept "Tipo di contenuto").Symfony2 + FOSRestBundle: attiva/disattiva la funzionalità REST per controller/azione?

Ho usato il FOSRestBundle e funziona molto bene, ma ora TUTTI mie pagine sono disponibili in XML (o JSON) per l'invio di Accept header 'Content Type: application/xml'.

Quindi, vorrei abilitare/disabilitare questa funzionalità per alcuni dei miei controller/azioni. Sarei l'ideale per farlo usando le annotazioni.

È possibile?

mio 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  

risposta

6

Secondo the RestBundle's documentation, non si otterrà un output XML se non si utilizza un View nel controller. Pertanto, se non si utilizza l'annotazione @View o View::create() nell'azione e si restituisce una risposta classica, verrà visualizzato un output HTML.

Se si vuole forzare il formato per alcuni motivi, è possibile ruotare la prefer_extension per true e regolare la definizione di routing:

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

Dove <format> è il formato che si desidera forzare.

2

È possibile impostare view_response_listener su false (il valore predefinito è force). Quindi aggiungere l'annotazione @View a ciascuna classe del controller, in cui si desidera utilizzare REST.

Esempio renderà più chiaro.

Un controler senza riposo:

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

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

    ... 
} 

E un altro controllore con il riposo. Si noti che è richiesta solo l'annotazione @View per la classe (a meno che non si desideri sovrascrivere il codice di stato della risposta).

/** 
* @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 è FOS\RestBundle\Controller\Annotations\View
  • Route è Symfony\Component\Routing\Annotation\Route
+1

suona bello, ma non sembra funzionare. –

+0

Funziona per me. Stai usando la classe di annotazione 'View' corretta? Potete fornire maggiori informazioni? –

+1

Se si usa FOS \ RestBundle \ Controller \ Annotations come Rest; ', le annotazioni dovrebbero essere' @Rest \ View' piuttosto che '@ View' – alexismorin

Problemi correlati