Symfony2 FOSRestBundle覆盖默认应用程序

时间:2016-04-15 11:34:20

标签: symfony fosrestbundle

我正在使用FOSRestBundle来管理我的api。我已经有一个正在运行的sf2应用程序,我想允许第三方访问我的一些应用程序功能。我配置了我的api,它按预期工作,我可以成功消耗我的api路由 例如:

GET http://my.domain.ldt/api/v1/users

我的Api只处理json格式,这是我的fos_rest配置:

fos_rest:
    param_fetcher_listener: true
    body_listener: true
    format_listener: true
    view:
        view_response_listener: 'force'
        exception_wrapper_handler: My\ApiBundle\Handlers\ApiExceptionWrapperHandler
        formats:
            json : true
        failed_validation: HTTP_BAD_REQUEST
        templating_formats:
            html: false
            xml: false
    routing_loader:
        default_format: json
        include_format: false
    exception:
        enabled: true
    service:
        view_handler: my.view_handler

services:
    my.json_handler:
       class: My\ApiBundle\Handlers\JsonHandler      

    my.view_handler:
       parent: fos_rest.view_handler.default
       calls:
        - ['registerHandler', [ 'json', ["@my.json_handler", 'createResponse'] ] ]

正如我所说,我的Api效果很好,但我遇到了一个主要问题:当我尝试从我的网络浏览器(http://my.domain.ldt/http://my.domain.ldt/login)访问主应用程序时,我得到了以下回复而不是我的经典网页:

An Exception was thrown while handling: No matching accepted Response format could be determined

为什么我的fos_rest conf适用于我的主网站?是否可以只为api路由设置api conf?我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

问题是你忘了为FOSRestBundle的格式监听器定义规则。

实际上我不确定你是否需要这个监听器,因为你似乎使用json作为默认格式。格式侦听器将尝试匹配Accept标头,并根据它提取当前请求格式。所以除非你想为你的api支持除json之外的其他格式,否则你就不能使用它。

如果您想修复它而不是删除它,您必须使用以下内容更新配置:

fos_rest:
    format_listener:
        enabled: true
        rules:
            - { path: '^/', priorities: ['json', 'xml', 'html], fallback_format: 'json' }

当然,您可以更改此规则,以便为您的api制定不同的规则:

fos_rest:
    format_listener:
        enabled: true
        rules:
            - { path: '^/api', fallback_format: 'json' }
            - { path: '^/', fallback_format: 'html' }