rest - 使用带有 Symfony 3.4 的 FOSRestBundle 为多个 REST 控制器进行路由
问题描述
我正在尝试使用 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}
--------------------------------- -------- -------- ------ -------------------------------
到目前为止,一切都很好。现在我想添加一个 V2 API:
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 路由。