2012-08-09 20 views
5

Một phần của đơn đăng ký của tôi sẽ có sẵn là API, vì vậy một số trang của tôi cần phải có sẵn trong JSON hoặc XML (dựa trên tiêu đề Chấp nhận 'Loại nội dung').Symfony2 + FOSRestBundle: Bật/tắt chức năng REST cho mỗi bộ điều khiển/tác vụ?

Tôi đã sử dụng FOSRestBundle và nó hoạt động rất tốt, nhưng bây giờ ALL trang của tôi có sẵn trong XML (hoặc JSON) khi gửi Chấp nhận tiêu đề 'Content Type: application/xml.

Vì vậy, tôi muốn bật/tắt chức năng này cho một số bộ điều khiển/hành động của tôi. Tôi sẽ là lý tưởng để làm điều này bằng cách sử dụng chú thích.

Điều đó có khả thi không?

config.yml của tôi:

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  

Trả lời

6

Theo the RestBundle's documentation, bạn sẽ không nhận được một đầu ra XML nếu bạn không sử dụng một View trong điều khiển của bạn. Vì vậy, nếu bạn không sử dụng chú thích @View hoặc View::create() trong hành động của mình và bạn trả lại phản hồi cổ điển, bạn sẽ nhận được kết quả HTML.

Nếu bạn muốn buộc định dạng cho một số lý do, bạn có thể biến prefer_extension để true và điều chỉnh định nghĩa định tuyến:

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

đâu <format> là định dạng mà bạn muốn để buộc.

2

Bạn có thể đặt view_response_listener thành false (mặc định là force). Và sau đó thêm chú thích @View vào mỗi lớp điều khiển của bạn, nơi bạn muốn sử dụng REST.

Ví dụ sẽ làm cho nó rõ ràng hơn.

Một khiển mà không REST:

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

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

    ... 
} 

Và một điều khiển với REST. Lưu ý rằng chỉ cần chú thích @View cho lớp đó (trừ khi bạn muốn ghi đè mã trạng thái phản hồi).

/** 
* @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
+1

Âm thanh tốt đẹp, nhưng nó dường như không làm việc. –

+0

Nó hoạt động cho tôi. Bạn có sử dụng đúng lớp chú thích 'View' không? bạn có thể cung cấp thêm thông tin không? –

+1

Nếu bạn 'sử dụng FOS \ RestBundle \ Controller \ Chú thích là Phần còn lại;', chú thích của bạn phải là '@Rest \ View' thay vì' @ View' – alexismorin

Các vấn đề liên quan