FOS Rest Custom получить URL в Symfony2

0

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

Пользовательский 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__);
}
  • 0
    Попробуйте удалить параметры GET из вашего маршрута. Вы все равно можете прикрепить их, но они не нужны для маршрутизации.
  • 0
    @Dragony Я попробовал это, но без помощи :(
Теги:
rest
phpunit
fosrestbundle

2 ответа

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;
    }

}
  • 0
    Но почему цикл только для чтения одного параметра? Я пробовал это: $ paramFetcher-> get ('cd'), но не работает
  • 0
    Цикл был только для демонстрации, это не единственный способ получить параметры. $ paramFetcher-> get ('cd') должен работать, взгляните на класс ParamFetcher.php, который он использует, используя Symfony Request Obj для получения параметров. github.com/FriendsOfSymfony/FOSRestBundle/blob/master/Request/...
Показать ещё 1 комментарий
1

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

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

то есть:

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

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

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

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

sth нравится:

$request=$this->getRequest();
$code = $request->get('cd') ? $request->get('cd') : false;
  • 0
    Нет, по-прежнему получается тот же результат: не найден маршрут для & quot; GET /api/v1/public/users/confirm.json/&quot; (404 Не Найдено)
  • 0
    Хорошо, наконец, это сработало, спасибо: D. После вашего предложения я указывал неверный URL-адрес следующим образом: /api/v1/public/users/confirm.json/?cd= <some> теперь работает: D

Ещё вопросы

Сообщество Overcoder
Наверх
Меню