Мне нужно создать пользовательский URL в моем API для отдыха. Я использую FOS Отдых расслоение.
Пользовательский URL выглядит так:
http://myapi.com/api/v1/public/users/confirm?cd=<some_code>.json
Я пытался:
@GET("/users/confirm?cd={cd}")
и когда я бегу:
php /app/console route:debug
Я получаю это:
...
....
get_confirm GET ANY ANY /api/v1/public/users/confirm?cd={cd}.{_format}
...
...
но в моем тесте, когда я пытаюсь нажать на этот URL, я получаю:
No route found for "GET /api/v1/public/users/confirm" (404 Not Found)
может кто-нибудь помочь мне в этом. Как сформировать такие URL.
Мой код действия контроллера:
/*
* @GET("/users/confirm?cd={cd}")
*/
public function getConfirmAction($cd) {
//Some code for user confirmation
return return View::create(array('successmessage'=>'Your account has been verified successfully. Please login.', Codes::HTTP_OK);
}
Код PHPUnitTest:
public function testGetConfirmThrowsInvalidArgumentException() {
$this->client->request(
'GET', '/api/v1/public/users/confirm?cd=abcd123.json'
);
$response = $this->client->getResponse();
print_r($response->getContent());
exit(__METHOD__);
}
Согласился с комментарием @john:
Вам не нужно добавлять параметры запроса в определение маршрута.
Я предполагаю, что в основном вы ищете, чтобы параметр всегда поставлялся с URL. Если это ваше требование, то FOSRestBundle имеет классную функцию, которая называется сборщик парам. С его помощью вы можете определять параметры строки запроса с помощью аннотаций, разрешать их обнулять или нет, устанавливать значения по умолчанию, определять требования.
для вашего случая, если вы ожидаете, что CD будет число, то вы можете иметь аннотации как
@QueryParam(name="cd", nullable=true, requirements="\d+")
см. пример ниже для примера кода
/*
* function desc
* @QueryParam(name="cd", nullable=true, requirements="\d+")
* @param ParamFetcher $paramFetcher
*/
public function getConfirmActionAction(ParamFetcher $paramFetcher)
{
//access the parameter here
foreach ($paramFetcher->all() as $name => $value) {
echo $name."==>". $value;
}
}
Вам не нужно добавлять параметры запроса в определение маршрута.
также они будут следовать после полного URL, например, после «.json»
то есть:
/api/v1/public/users/confirm.json?cd=ejwffw
так что у меня нет опыта с определениями маршрутизации аннотаций, но это должно быть что-то вроде этого:
@GET("/users/confirm.{_format}")
и в вашем действии у вас есть доступ к вашему параметру через запрос
что-то вроде:
$request=$this->getRequest();
$code = $request->get('cd') ? $request->get('cd') : false;