我的控制器针对客户端发送的标头返回不同的内容类型HTTP
Accept
。目前,我的控制器在高层次上遵循以下模式:
/**
* @Route("/SomePath")
* @Method({"GET"})
* @param Request $request The HTTP request
* @return Symfony\Component\HttpFoundation\Response The HTTP response
*/
public function getSomething( Request $request ) {
$acceptedTypes = $request->getAcceptableContentTypes();
if( in_array('text/html', $acceptedTypes ) )
return $this->getSomethingHTML( $request );
if( in_array('application/json', $acceptedTypes ) )
return $this->getSomethingJSON( $request );
throw new NotAcceptableHttpException();
}
public function getSomethingHTML( Request $request ) {
// ...
}
public function getSomethingHTML( Request $request ) {
// ...
}
我想实现这样的事情来避免这种不必要的重复第一种方法:
/**
* @Route("/SomePath")
* @Method({"GET"})
* @Accepts("text/html")
* @param Request $request The HTTP request
* @return Symfony\Component\HttpFoundation\Response The HTTP response
*/
public function getSomethingHTML( Request $request ) {
// ...
}
/**
* @Route("/SomePath")
* @Method({"GET"})
* @Accepts("application/json")
* @param Request $request The HTTP request
* @return Symfony\Component\HttpFoundation\JsonResponse The HTTP response
*/
public function getSomethingJSON( Request $request ) {
// ...
}
这里。@Accepts
是一个新的自定义注释,仅当在请求的可接受内容类型数组中找到给定字符串时才匹配。如何实现我自己的@Accepts
注解以及如何让 Symfony 意识到它?
Nb:我知道如果我condition
使用@Route
. 但是,这仍然需要大量重复的代码。