fos rest custom получить URL-адрес в symfony2

Мне нужно создать настраиваемый URL-адрес в моем rest api. Я использую комплект fos rest.

настраиваемый 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 &quot;GET /api/v1/public/users/confirm&quot; (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__);
}

person Ashish Awasthi    schedule 18.02.2015    source источник
comment
Попробуйте удалить параметры GET из вашего маршрута. Вы все равно можете прикрепить их, но они вам не нужны для маршрутизации.   -  person Dragony    schedule 18.02.2015
comment
@Dragony Я пробовал это, но безрезультатно :(   -  person Ashish Awasthi    schedule 18.02.2015


Ответы (2)


Согласен с комментарием @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;
    }

}
person Rahul    schedule 18.02.2015
comment
Но зачем цикл для чтения одного параметра? Я пробовал это: $ paramFetcher- ›get ('cd'), но не работает - person Ashish Awasthi; 18.02.2015
comment
Цикл был предназначен только для демонстрационных целей, это не единственный способ получить параметры. $ paramFetcher- ›get ('cd') должен работать, взгляните на класс ParamFetcher.php, который использует объект запроса Symfony для получения параметров. github.com/FriendsOfSymfony/ - person Rahul; 18.02.2015
comment
наконец-то получил это, вам нужно использовать w +: * @QueryParam (name = cd, nullable = true, requirements = \ w +), потому что мой токен представляет собой большую буквенно-цифровую строку - person Ashish Awasthi; 18.02.2015

вам не нужно добавлять параметры запроса в определение маршрута

также они будут идти после полного URL-адреса, например, после ".json"

i.e:

/api/v1/public/users/confirm.json?cd=ejwffw

поэтому у меня нет опыта с определениями маршрутизации аннотаций, но это должно быть так:

@GET("/users/confirm.{_format}")

и в вашем действии у вас есть доступ к вашему параметру через запрос

что-то вроде:

$request=$this->getRequest();
$code = $request->get('cd') ? $request->get('cd') : false;
person john Smith    schedule 18.02.2015
comment
Нет, по-прежнему получается тот же результат: не найден маршрут для GET /api/v1/public/users/confirm.json/ (404 не найден) - person Ashish Awasthi; 18.02.2015
comment
Хорошо, наконец, это сработало, спасибо: D. После вашего предложения я выбрал неправильный URL-адрес: /api/v1/public/users/confirm.json/?cd= ‹some›, теперь он работает: D - person Ashish Awasthi; 18.02.2015