Смешивание параметров маршрута и запроса с помощью FOSRestBundle с Symfony

используя Symfony2 и FOSRestBundle я пытаюсь реализовать методы API, которые имеют некоторое количество фиксированных параметров, определенных в маршруте, а также некоторые дополнительные параметры, которые могут существовать в строке запроса.

например:

 http://somesite.com/api/method/a/b
 http://somesite.com/api/method/c/d?x=1&y=2

по данным документация для FOSRestBundle, ParamFetcher-это правильный способ сделать это, используя аннотацию @QueryParam. Однако, у меня уже есть определенный контроллер например:

 use SymfonyBundleFrameworkBundleControllerController;
 use FOSRestBundleControllerAnnotationsGet;
 use FOSRestBundleControllerAnnotationsView;

 class MyController extends Controller
 {

   /**
    * @Get("/method/{a}/{b}")
    * @View()
    */
   public function getMethodAction($a, $b)
   {
     // do stuff

     return array('foo' => 'bar');
   }

 }

теперь кажется, что мне нужно иметь доступ к экземпляру ParamFetcher, но я не знаю, как (и поиск Google не очень помог). Я знаю из документации, что я могу просто изменить подпись метода, чтобы включить ParamFetcher, однако, когда я это делаю, он перемещает параметры в строку запроса, которую я не могу иметь.

есть ли способ смешать два, или я должен отказаться от ParamFetcher и перейти к просто проверке запроса непосредственно используя встроенный объект запроса Symfomy?

2 ответов


этот вопрос довольно старый, и вы, вероятно, уже нашли решение, но так как я попал сюда через поиск Google и знаю ответ, я внесу свой вклад.

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\JsonResponse;
use FOS\RestBundle\Request\ParamFetcher;
use FOS\RestBundle\Controller\Annotations\QueryParam;
use Nelmio\ApiDocBundle\Annotation\ApiDoc;

class DefaultController extends Controller
{
    /**
     * Returns a collection of Task
     *
     * @QueryParam(name="projectId", nullable=true, requirements="\d+")
     * @QueryParam(name="name", nullable=true, description="Project Name")
     * @QueryParam(name="assignee", nullable=true)
     * @QueryParam(name="depth", nullable=true)
     *         *
     * @param ParamFetcher $paramFetcher
     * @ApiDoc()
     *
     * @return JsonResponse
     */
    public function cgetTaskAction(ParamFetcher $paramFetcher)
    {
        foreach ($paramFetcher->all() as $criterionName => $criterionValue) {
            // some logic here, eg building query
        }

        $results = // query database using criteria from above

        // this is just a simple example how to return data
        return new JsonResponse($results);
    }
}

просто хотел опубликовать ответ, потому что исходный ответ использует только QueryParams, и вопрос использовал QueryParams вместе с RouteParams.

Если вы хотите использовать параметры маршрута и параметры запроса, Вы можете использовать ParamFetcher в качестве первого аргумента действия и добавить аргументы маршрута позже.

Я еще не нашел способ добавить параметры маршрута в paramFetcher.

/*
 * @Route("/term/{termId}", requirements={"termId" = "[a-z0-9]+"})
 *
 * @QueryParam(name="limit", requirements="\d+", default="30", description="How many documents to return.")
 *
 * @Method("GET")
 *
 * @param ParamFetcherInterface $paramFetcher
 * @param $termId
 * @return array()
 */
public function getTermFeedAction(ParamFetcherInterface $paramFetcher, $termId) {
    // access $termId over the method parameter
    // access the @queryparams via the $paramFetcher

}