4

这是我们的控制器:

function getLocationsAction(Request $request) {

        $dm = $this->get('doctrine.odm.mongodb.document_manager');
        $query = $dm->createQueryBuilder('MainClassifiedBundle:Location')->select('name', 'state', 'country', 'coordinates');
        $locations = $query->getQuery()->execute();

        $data = array(
            'success' => true,
            'locations' => $locations,
            'displaymessage' => $locations->count() . " Locations Found"
        );

        $view = View::create()->setStatusCode(200)->setData($data);
        return $this->get('fos_rest.view_handler')->handle($view);
    }

这是 fosrestbundle 的 config.yml:

fos_rest:
    view:
        formats:
            json: true
        templating_formats:
            html: true
        force_redirects:
            html: true
        failed_validation: HTTP_BAD_REQUEST
        default_engine: twig

这是路线:

MainClassifiedBundle_get_locations:
    pattern:  /locations/
    defaults: { _controller: MainClassifiedBundle:ClassifiedCrudWebService:getLocations, _format:json}
    requirements:
        _method:  GET

为什么我们得到 text/html ?我们如何强制响应为 application/json?

请帮助,因为这正在造成巨大的痛苦

4

2 回答 2

12

您正在静态创建视图并且尚未启用任何侦听器。

这种方式不涉及格式猜测。

将格式作为参数传递给您的函数并在 View 对象上设置格式:

function getLocationsAction(Request $request, $_format) {
{
    // ...
    $view = View::create()
         ->setStatusCode(200)
         ->setData($data)
         ->setFormat($_format)   // <- format here
    ;
    return $this->get('fos_rest.view_handler')->handle($view);
}

请参阅文档章节The View Layer


如果您想要自动格式猜测,您必须启用listeners

fos_rest:
    param_fetcher_listener: true
    body_listener: true
    format_listener: true
    view:
        view_response_listener: 'force'

阅读更多内容,请参阅“监听器支持”一章。

于 2013-07-05T07:57:54.227 回答
0

或者,如果您不能依赖 $_format (在我的情况下),您可以像这样显式设置格式:

    public function createAction(Request $request): Response
{
    // ...

    return $this->viewHandler->handle(View::create($json)->setFormat('json'));
}
于 2016-07-28T14:34:08.910 回答