2012-08-09 5 views
5

내 응용 프로그램의 일부는 API으로 사용할 수 있으므로 내 페이지 중 일부는 Accept 헤더 'Content Type'을 기반으로하여 JSON 또는 XML로 사용할 수 있어야합니다.Symfony2 + FOSRestBundle : 컨트롤러/액션별로 REST 기능을 활성화/비활성화 하시겠습니까?

가 나는 FOSRestBundle 사용했습니다 및 '콘텐츠 유형 : 응용 프로그램/XML을'Accept 헤더를 보낼 때 아주 잘 작동하지만, 지금 ALL 내 페이지가 XML (또는 JSON)에서 사용할 수 있습니다.

그래서 일부 컨트롤러/동작에 대해이 기능을 활성화/비활성화하고 싶습니다. 주석을 사용하여이 작업을 수행하는 것이 이상적입니다.

그럴 수 있습니까?

내 config.yml : 당신이 컨트롤러에 View를 사용하지 않는 경우

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에 따르면, 당신은 XML 출력을받지 않습니다. 따라서 액션에 @View 특수 효과 또는 View::create()을 사용하지 않고 고전적인 응답을 보내면 HTML 출력이 표시됩니다. 당신이 어떤 이유로 형식을 강제하려면

, 당신은 prefer_extensiontrue에 전원을 켜고 라우팅 정의를 조정할 수 있습니다

<format> 당신이 강제로 원하는 형식이다
my_route: 
    pattern: /my-route 
    defaults: { _controller: AcmeDemoBundle:action, _format: <format> } 

.

2

view_response_listener에서 false까지 설정할 수 있습니다 (기본값 : 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
  • RouteSymfony\Component\Routing\Annotation\Route
+1

좋은 소리입니다,하지만 작동하지 않습니다. –

+0

그것은 나를 위해 작동합니다. 올바른'View' 주석 클래스를 사용하고 있습니까? 더 많은 정보를 제공 할 수 있습니까? –

+1

FOS \ RestBundle \ Controller \ Annotations를 Rest;로 사용한다면, 주석은'@View'보다는'@Rest \ View'이어야합니다 – alexismorin

관련 문제