FOSRestBundle如何返回JsonResponse

时间:2014-08-22 21:27:13

标签: symfony fosrestbundle

关于此问题有很多话题,但我找到的答案都没有为我工作。

我想使用FOSRestBundle构建一个返回JSON的API(现在,我将来可能会添加XML)。

当我向我的路线发出请求时,我有以下例外:

[
   {
       message: "Unable to find template "".",
       class: "InvalidArgumentException",
   ...

我有一个动态构建路由的控制器。我配置了json格式,并返回一个带有数据数组的View,以便在json中进行序列化。如果不使用FOSRestBundle,我会返回一个JSONResponse并完成它,但正如我所说的,我最终会在将来添加其他格式,所以我想以正确的方式做事。

这是我的路线:

categories:
    type: rest
    resource: Certiz\Bundle\ExamBundle\Controller\CategoryController
    prefix: /api
    requirements:
        _format: "json"

我要求以下路线: / API /类别

我的config.yml:

fos_rest:
view:
    formats:
        json: true
        xml: false
        html: false
        rss: false
    templating_formats:
        json: true
        xml: false
        html: false
        rss: false
    view_response_listener: 'force'
routing_loader:
    default_format: json
    include_format: true
exception:
    codes:
        'Symfony\Component\Security\Core\Exception\InsufficientAuthenticationException': 401
    messages:
        'Symfony\Component\Security\Core\Exception\InsufficientAuthenticationException': true

jms_serializer:
    metadata:
        directories:
            exam:
                namespace_prefix: "Certiz\\Bundle\\ExamBundle"
                path: "@CertizExamBundle/Resources/config/serializer"

我的控制员:

public function getCategoriesAction()
{
    $categories = $this
        ->getDoctrine()
        ->getManager()
        ->getRepository('Certiz\Bundle\ExamBundle\Entity\Category')
        ->getTree();

    return View::create()
        ->setStatusCode(200)
        ->setData($categories)
   ;
} // "get_categories" [GET] /categories

我使用symfony 2.5和FOSRestBundle 1.4.2。

此致

2 个答案:

答案 0 :(得分:3)

我发现了什么问题。在我的fos_rest config.yml中,我说json格式的响应应该由模板引擎而不是序列化程序来管理。

我将配置更改为:

fos_rest:
    view:
        templating_formats:
            json: false

答案 1 :(得分:2)

来自FOSRestBundle文档:

  

格式和templating_formats设置决定了哪些格式   分别由序列化器和模板支持   层。换句话说,templating_formats中列出的任何格式都将   需要一个模板来使用模板服务进行渲染   格式中列出的任何格式都将使用序列化程序进行渲染。   对于这两个设置,值false表示给定格式   禁用。

因此我认为您应该从配置中排除未使用的格式,并留下您真正需要的内容,以使您的内容更具可读性:

fos_rest:
    view:
        formats:
            json: true
        templating_formats:
            html: true