5

我的应用程序的一部分将作为API提供,因此我的一些页面需要以 JSON 或 XML 的形式提供(基于 Accept 标头“内容类型”)。

我使用了FOSRestBundle,它运行良好,但现在在发送 Accept 标头“内容类型:应用程序/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 的文档,如果您不在View控制器中使用 a,您将不会获得 XML 输出。因此,如果您在操作中不使用@View注释或 a View::create(),并且返回经典响应,您将获得 HTML 输出。

如果出于某些原因要强制格式化,可以将prefer_extensionto转为true并调整路由定义:

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

<format>您要强制使用的格式在哪里。

于 2012-08-16T09:24:32.437 回答
2

您可以设置view_response_listenerfalse(默认为force)。然后将@View注释添加到您要使用 REST 的每个控制器类。

示例将使其更清楚。

没有 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 回答