Как указать формат по умолчанию для FOSRestBundle в json?


Моя соответствующая конфигурация

fos_rest:
    view:
        view_response_listener: force

sensio_framework_extra:
    view:
        annotations: false

И действительно раздражает указывать маршрут как

@Route("/jobs", defaults={ "_format" = "json" })

Каждый раз.

Так можно ли где-нибудь указать, что это предполагается по умолчанию?

PS:

Если я удалю defaults={ "_format" = "json" } и вызову конечную точку /jobs, я получу исключение

Unable to find template "APIBundle:Jobs:post.html.twig".

PPS:

routing_loader:
    default_format: json

Не будет работать, потому что он используется только для автоматической генерации маршрутов.

Author: zerkms, 2013-10-16

3 answers

Окончательный ответ намного проще и не имеет отношения к FOS\restbundle:

api:
    resource: "@APIBundle/Controller/"
    type:     annotation
    defaults: {_format: json} # <<<<<<<
    prefix:   /api/
 21
Author: zerkms, 2013-10-16 20:14:46

Вы можете указать default_format, который загрузчик маршрутизации будет использовать для параметра _format, если он не указан.

# app/config/config.yml
fos_rest:
    routing_loader:
        default_format: json

По умолчанию маршруты генерируются с помощью строки {_format}. Если вы хотите получить чистые URL-адреса (/jobs вместо /jobs.{_format}), то все, что вам нужно сделать, это добавить некоторую конфигурацию:

# app/config/config.yml
fos_rest:
    routing_loader:
        include_format:       false

Ознакомьтесь с документацией FOSRestBundle для получения дополнительной информации.

 10
Author: Picoss, 2013-10-16 07:31:23

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

конфигурация.yml

fos_rest:
    format_listener:
        rules:
            # setting fallback_format to json means that instead of considering
            # the next rule in case of a priority mismatch, json will be used
            -
                path: '^/'
                host: 'api.%domain%'
                priorities: ['json', 'xml']
                fallback_format: json
                prefer_extension: false

Таким образом, запрос, сделанный с помощью Accept-headers, содержащий

text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,application/json

Приведет к формату запроса json

 7
Author: Touki, 2013-10-16 07:49:29