首页 > 解决方案 > 使用带有 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

无需重写整个路由/控制器即可完成这项工作的任何提示?现有文档似乎并不完全准确,记录的字段不起作用。

标签: restsymfonyroutingfosrestbundlesymfony-3.4

解决方案


可能生成的 V2 路由替换了 V1 路由,因为它们具有相同的生成名称。事实上,正如您所知,FOSRest 可以生成 REST 路由。


推荐阅读