Смешивание параметров маршрута и запроса с помощью 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
}