Я пытаюсь настроить маршрутизацию с помощью FOSRestBundle (2.3.1) с Symfony (3.4.11). Следующее работает должным образом:
routing.yml:
fooV1:
type: rest
resource: AppBundle\Controller\V1\FooController
prefix: /api/v1
производство:
/bin/console debug:router
--------------------------------- -------- -------- ------ -------------------------------
Name Method Scheme Host Path
--------------------------------- -------- -------- ------ -------------------------------
get_foos GET ANY ANY /api/v1/foos.{_format}
get_foo GET ANY ANY /api/v1/foos/{bar}.{_format}
post_foos POST ANY ANY /api/v1/foos.{_format}
put_foos PUT ANY ANY /api/v1/foos/{bar}.{_format}
delete_foos DELETE ANY ANY /api/v1/foos/{bar}.{_format}
--------------------------------- -------- -------- ------ -------------------------------
Все идет нормально. Теперь я хочу добавить API V2:
routing.yml:
fooV1:
type: rest
resource: AppBundle\Controller\V1\FooController
prefix: /api/v1
fooV2:
type: rest
resource: AppBundle\Controller\V2\FooController
prefix: /api/v2
Проблема в том, что маршруты / контроллер V1, кажется, полностью исчезают, и остается только V2 (обратите внимание, что у контроллеров есть те же методы, меняется только формат ответа, следовательно, новая версия):
/bin/console debug:router
--------------------------------- -------- -------- ------ -------------------------------
Name Method Scheme Host Path
--------------------------------- -------- -------- ------ -------------------------------
get_foos GET ANY ANY /api/v2/foos.{_format}
get_foo GET ANY ANY /api/v2/foos/{bar}.{_format}
post_foos POST ANY ANY /api/v2/foos.{_format}
put_foos PUT ANY ANY /api/v2/foos/{bar}.{_format}
delete_foos DELETE ANY ANY /api/v2/foos/{bar}.{_format}
--------------------------------- -------- -------- ------ -------------------------------
Моя конфигурация fos_rest (в config.yml):
fos_rest:
exception:
enabled: true
exception_controller: 'AppBundle\Controller\ExceptionController::showAction'
routing_loader:
default_format: json
view:
view_response_listener: force
formats:
rss: false
xml: false
json: true
jsonp: false
body_converter:
enabled: true
body_listener:
default_format: json
Какие-нибудь советы по выполнению этой работы без необходимости переписывать всю маршрутизацию / контроллеры? Существующая документация не кажется полностью точной, с задокументированными полями, которые не работают.





Возможно, сгенерированные маршруты V2 заменят маршруты V1, потому что они имеют одинаковые сгенерированные имена. Действительно, FOSRest может генерировать маршруты REST, как вы уже знаете.
В самом деле, вот оно что! Для всех, кто боролся с этим, решением было просто добавить
@NamePrefix("v1")и@NamePrefix("v2")к каждому контроллеру, просто чтобы убедиться, что сгенерированные маршруты имеют разные имена. Спасибо!