如何按内容类型分隔POST请求?

时间:2015-08-17 12:24:16

标签: php symfony fosrestbundle

我想根据客户提供的内容类型执行不同的操作。我为此配置了2个控制器操作:

/**
 * @Post("", requirements={"_format": "json"})
 */
public function postJsonAction(Request $request)
{
    // 
}

/**
 * @Post("", requirements={"_format": "csv"})
 */
public function postCsvAction(Request $request)
{
    //
}

但是,这对我不起作用,始终执行第一个操作。我在这做错了什么? 这是我在config.yml中的fos_rest配置:

fos_rest:
    param_fetcher_listener: true
    allowed_methods_listener: true
    routing_loader:
        default_format: json
        include_format: false
    view:
        mime_types: { 'csv': ['text/csv'], 'xlsx': ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'] }
        formats:
            json: true
            csv: true
            xlsx: true
    format_listener:
        rules:
            - { path: '^/api', priorities: ['json', 'csv', 'xlsx'], fallback_format: ~, exception_fallback_format: json, prefer_extension: false }
    service:
        view_handler: app.view_handler

1 个答案:

答案 0 :(得分:1)

您可以在路线中进行配置。例如,如果您使用的是yml路由配置。

csv:
    path:      /article/format/csv/
    defaults:  { _controller: AppBundle:Article:postCsv }

json:
    path:      /article/format/json/
    defaults:  { _controller: AppBundle:Article:postJson }

然后,使用JS来更改表单操作。

if ("csv" === $("#format").val()) {
   $('#your_form').attr('action', '/article/format/csv/');
}
else {
   $('#your_form').attr('action', '/article/format/json/');
}