Создайте пользовательскую аннотацию для маршрутов Symfony, чтобы проверять заголовок HTTP Accept в запросе
Мои контроллеры возвращают разные типы контента относительно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: я знаю, что смог бы достичь 90% решения, если бы использовал condition
параметр @Route
, Однако это все равно повлечет за собой много повторяющегося кода.