2012-08-09 19 views
5

APIのようにのページがあります。は、Acceptヘッダー 'Content Type'に基づいて、JSONまたはXMLで利用できる必要があります。Symfony2 + FOSRestBundle:コントローラー/アクションごとにREST機能を有効/無効にしますか?

は私がFOSRestBundle使用してきましたし、「コンテンツタイプ:アプリケーション/ XMLの」Acceptヘッダを送信するとき、それは非常によく動作しますが、今ALL私のページはXML(またはJSON)でご利用いただけます。

私はこの機能をいくつかのコントローラ/アクションで有効/無効にしたいと思います。私はアノテーションを使ってこれを行うのが理想的です。

これは可能ですか?

マイ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  

答えて

6

the RestBundle's documentationによると、あなたのコントローラでViewを使用しない場合は、XML出力を取得することはありません。したがって、あなたの行動に@View注釈、またはView::create()を使用せず、古典的な応答を返すと、HTML出力が得られます。

あなたには、いくつかの理由のためのフォーマットを強制したい場合は、trueprefer_extensionをオンにし、ルーティング定義調整することができます。<format>はあなたが強制する形式である

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

を。

2

view_response_listenerfalse(既定値はforce)を設定できます。次に、RESTを使用する各コントローラクラスに@Viewアノテーションを追加します。

例でより明確になります。

REST無しのcontroler:

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

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

    ... 
} 

残りと別のコントローラ。クラスのアノテーションは@View(レスポンスステータスコードをオーバーライドしない場合を除き)のみ必要であることに注意してください。

/** 
* @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) { ... } 

    ... 
} 
  • ViewFOS\RestBundle\Controller\Annotations\View
  • RouteあるSymfony\Component\Routing\Annotation\Route
+1

で素敵に聞こえるが、動作するようには思えません。 –

+0

それは私のために働く。正しい 'View'アノテーションクラスを使用していますか?より多くの情報を提供できますか? –

+1

FOS \ RestBundle \ Controller \ AnnotationsをRest;として使用すると、アノテーションは '@View'ではなく' @Rest \ View'でなければなりません – alexismorin

関連する問題