5

アプリケーションの一部はAPIとして利用できるため、一部のページはJSONまたはXML(Acceptヘッダーの「コンテンツタイプ」に基づく)で利用できる必要があります。

FOSRestBundleを使用しましたが、非常にうまく機能しますが、Acceptヘッダーの「ContentType:application / xml」を送信すると、すべてのページが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    
4

2 に答える 2

6

RestBundle のドキュメントによると、コントローラーでa を使用しない場合、XML 出力は得られませんView。したがって、アクションで@Viewアノテーションまたは aView::create()を使用せず、従来の応答を返す場合、HTML 出力が得られます。

何らかの理由でフォーマットを強制したい場合は、を変更してルーティング定義を調整prefer_extensionできます。true

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

<format>強制したい形式はどこにありますか。

于 2012-08-16T09:24:32.437 に答える
2

view_response_listenerに設定できfalseます(デフォルトはforce)。次に、@ViewRESTを使用する各コントローラークラスにアノテーションを追加します。

例はそれをより明確にします。

RESTなしのコントローラー:

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

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

    ...
}

そして、RESTを備えた別のコントローラー。@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
  • RouteSymfony\Component\Routing\Annotation\Route
于 2012-08-27T14:12:18.870 に答える