FOSRestBundle: маршруты и аннотации для параметров

я могу получить параметры GET с @QueryParam() аннотация, но похоже, что она работает только для данных строки запроса:/user?id=123.

Я бы предпочел, чтобы это было как /user/123 вместо. Для этого я мог бы использовать @Get("/user/{id}") аннотация, но я не вижу в ней дополнительных метаданных, которые @QueryParam() есть:

name="id", requirements="d+", default="1", description="User id"

если я использую обе аннотации, я получаю сообщение об ошибке:

ParamFetcher parameter conflicts with a path parameter 'id' for route 'getone'

мой конфликтующий docblock:

/**
 * Finds and displays a Users entity.
 *
 * @RestView
 * @RestGet("/user/{id}")
 * @RestQueryParam(name="id", requirements="d+", default="1", description="User id")
 * @ApiDoc(section="Partner Users")
 * @param int $id
 * @return array
 */

PS мне нужно иметь id в путь (/user/123), не в запросе, и мне также нужно использовать @QueryParam() как это читается NelmioApiDocBundle. Как я могу решить эту проблему?

2 ответов


FOSRestBundle это @Get аннотация расширяет FOSRestBundle в @Route что в свою очередь расширяет SensioFrameworkExtraBundle в @Route.

посмотреть код и смотрите главу документации @Route и @Method.

на requirements и defaults атрибуты ожидают массив.

/**
  * @Rest\View
  * @Rest\Get("/user/{id}", requirements={"id" = "\d+"}, defaults={"id" = 1})
  * @ApiDoc(
  *  description="Returns a User Object",
  *  parameters={
  *      {"name"="id", "dataType"="integer", "required"=true, "description"="User Id"}
  *  }
  * )
  */
 public function getAction($id)
 {
    // ...
 }

Если вы хотите описание требований, просто сделайте это в своей аннотации

   /**
  * @Rest\View
  * @Rest\Get("/user/{id}", requirements={"id" = "\d+"}, defaults={"id" = 1})
  * @ApiDoc(
  *  description="Returns a User Object",
  *  requirements={
  *      {"name"="id", "dataType"="integer", "required"=true, "description"="User Id"}
  *  }
  * )
  */