3

我的控制器针对客户端发送的标头返回不同的内容类型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. 但是,这仍然需要大量重复的代码。

4

0 回答 0