Маршрутная аннотация @Method, кажется, не соблюдается при сопоставлении маршрутов - PullRequest
1 голос
/ 26 апреля 2019

При разрешении одинаково доступных маршрутов я понимаю, что порядок маршрутов имеет значение.

Где я запутался, почему при отправке запроса DELETE на этот маршрут он совпадает с маршрутом GET, вместо того, чтобы игнорировать его и пробовать подходящий метод под ним?

    /**
     * @Route("/{game}")
     * @Method({"GET"})
     */
    public function single(Request $request, GameSerializer $gameSerializer, Game $game) {
        $out = $gameSerializer->bind($game);
        return new JsonResponse($out);
    }

    /**
     * @Route("/{game}")
     * @Method({"DELETE"})
     */
    public function remove(Request $request, Game $game) {
        $em = $this->getDoctrine()->getManager();


        $em->remove($game);
        $em->flush();

        return new JsonResponse([], 200);
    }

enter image description here

enter image description here

Полное раскрытие

Я понимаю , почему соответствует самому верхнему маршруту на основе строго шаблонов

Я не понимаю, почему метод доступа игнорируется при этом

Итак, просто для проверки я настроил перемещение по маршруту DELETE выше GET маршрута


    /**
     * @Route("/{game}")
     * @Method({"DELETE"})
     */
    public function remove(Request $request, Game $game) {
        $em = $this->getDoctrine()->getManager();

        $em->remove($game);
        $em->flush();

        return new JsonResponse([], 200);
    }

    /**
     * @Route("/{game}")
     * @Method({"GET"})
     */
    public function single(Request $request, GameSerializer $gameSerializer, Game $game) {
        $out = $gameSerializer->bind($game);
        return new JsonResponse($out);
    }

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

enter image description here

и, боже, он когда-нибудь удалял эту запись?

Почему метод доступа игнорируется?

Ответы [ 2 ]

2 голосов
/ 26 апреля 2019

Прежде всего, следите за тем, какую версию SensioFrameworkExtraBundle вы используете, потому что аннотация @Method из SensioFrameworkExtraBundle удалена в последней версии.Вместо этого аннотация Symfony @Route определяет параметр методов для ограничения методов HTTP маршрута:

*
* @Route("/show/{id}", methods={"GET","HEAD"})
*

Но в вашем случае , если вы используете формы HTML и методы HTTP, отличные от GETи POST , вам нужно будет включить параметр _method, чтобы подделать метод HTTP.

См. Как изменить действие и метод формы для получения дополнительной информации .

0 голосов
/ 26 апреля 2019

Я думаю, что вы должны добавить название маршрута, и оно должно быть уникальным.

Попробуйте следующим образом:

/**
     * @Route("/{game}",name="api_remove")
     * @Method({"DELETE"})
     */
    public function remove(Request $request, Game $game) {
      ...
    }

    /**
     * @Route("/{game}",name="single_remove")
     * @Method({"GET"})
     */
    public function single(Request $request, GameSerializer $gameSerializer, Game $game) {
       ...
    }

...