FOSRestBundle как вернуть JsonResponse

Об этом много тем, но ни один из ответов, которые я нашел, не помог мне.

Я хочу использовать FOSRestBundle для создания API, возвращающего JSON (на данный момент я, возможно, добавлю XML в будущем).

Когда я делаю запрос на свой маршрут, у меня есть следующее исключение:

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

У меня есть контроллер с динамически построенным маршрутом. Я настроил формат json и возвращаю представление с массивом данных для сериализации в json. Без использования FOSRestBundle я бы вернул JSONResponse и покончил с этим, но, как я уже сказал, в будущем я добавлю другие форматы, поэтому я хотел бы сделать все правильно.

Это мой маршрут:

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

Я запрашиваю следующий маршрут: /api/categories

Мой 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.

С уважением


person jobou    schedule 22.08.2014    source источник


Ответы (2)


Я нашел, что было не так. В моем fos_rest config.yml я сказал, что ответ для формата json должен управляться механизмом шаблонов, а не сериализатором.

Я изменил свою конфигурацию на:

fos_rest:
    view:
        templating_formats:
            json: false
person jobou    schedule 22.08.2014

из документации FOSRestBundle:

Параметры formats и templating_formats определяют, какие форматы соответственно поддерживаются сериализатором и уровнем шаблона. Другими словами, любой формат, указанный в templating_formats, потребует шаблона для рендеринга с использованием службы шаблонов, в то время как любой формат, указанный в formats, будет использовать сериализатор для рендеринга. Для обоих параметров значение false означает, что данный формат отключен.

поэтому я думаю, что вы должны исключить неиспользуемые форматы из своей конфигурации и оставить только то, что вам действительно нужно, чтобы сделать вашу конфу более читабельной:

fos_rest:
    view:
        formats:
            json: true
        templating_formats:
            html: true
person Pavel Alazankin    schedule 17.10.2017