2016-05-20 2 views
2

может быть действием контроллера в SF3, аннотированным для использования определенного «Content-Type»?Symfony 3 ограничивает действие контроллера, чтобы потреблять определенный тип контента

Я пытаюсь отказаться от маршрута «/ api/post/{id}/xml».

namespace AppBundle\Controller; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; 
class BlogApiController extends Controller 
{ 
/** 
* @Route("/api/posts/{id}") 
* @Method({"GET","HEAD"}) 
* some-magic-annotation-here 
*/ 
public function showJson($id) 
{ 
    // response in json 
} 

/** 
* @Route("/api/posts/{id}") 
* @Method({"GET","HEAD"}) 
* some-magic-annotation-here 
*/ 
public function showXml($id) 
{ 
    // response in XML 
} 
} 

ответ

1

Используйте _format:

class BlogApiController extends Controller 
{ 
    /** 
    * @Route("/api/posts/{id}.{_format}", defaults={"_format": "json"}) 
    * @Method({"GET","HEAD"}) 
    */ 
    public function getPost($id, $_format) 
    { 
     // Retrieve your object 

     if ('xml' == $_format) { 
      return $this->showXml($object); 
     } 

     return $this->showJson($object); 
    } 
} 

Если вам необходимо проверить тип содержимого входящего запроса:

$contentType = $request->headers->get('Content-Type'); 

if (0 === strpos($contentType, 'application/json')) { 
    return $this->showJson($object); 
} elseif (0 === strpos($contentType, 'application/xml')) { 
    return $this->showXml($object); 
} 

В следующий раз, если вы еще не используйте его, вы должны использовать компонент Serializer и удалить два метода show[format], например:

$encoders = array(new XmlEncoder(), new JsonEncoder()); 
$normalizers = array(new ObjectNormalizer()); 
$serializer = new Serializer($normalizers, $encoders); 

$responseBody = $serializer->serialize($object, $_format);