Создайте пользовательскую аннотацию для маршрутов Symfony, чтобы проверять заголовок HTTP Accept в запросе

Мои контроллеры возвращают разные типы контента относительноHTTPAccept заголовок отправлен клиентом. На данный момент на высоком уровне мои контроллеры следуют этой схеме:

/**
 * @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, Однако это все равно повлечет за собой много повторяющегося кода.

0 ответов

Другие вопросы по тегам