Типы MIME поставщиков и версии API в Symfony2 с FOSRestBundle и JMSSerializerBundle

Я хочу обрабатывать разные версии ресурса с заголовком запроса «Принять».

===>
GET /customer/123 HTTP/1.1
Accept: application/vnd.company.myapp.customer-v3+json

<===
HTTP/1.1 200 OK
Content-Type: application/vnd.company.myapp-v3+json

{"customer":
  {"name":"Neil Armstrong"}
}

Я хочу прочитать заголовок Accept, извлечь версию и инициализировать сериализатор этой версией!

Это возможно с FOSRestBundle?

Я знаю, что могу прослушать kernel.request, проверить заголовок «Accept» и извлечь запрошенную версию из типа MIME, но я не знаю, как установить сериализатор с этим значением...

Я также прочитал документацию FOSRestBundle и знаю, что вы можете добавить новые типы mime в конфигурацию:

view.mime_types: {'json': ['application/vnd.company.myapp.customer-v1+xml', 'application/vnd.company.myapp.customer-v2+xml']}

Мне нужно добавить сюда все возможные типы пантомимы (с разными версиями)?

Любая помощь будет оценена!


person Fernando P. G.    schedule 12.11.2013    source источник


Ответы (2)


Пока это вам не поможет, но есть нерешенные проблемы, связанные с управлением версиями API. https://github.com/FriendsOfSymfony/FOSRestBundle/pull/632

person Eisenrich    schedule 10.12.2013

Теперь это возможно, см. документацию.

Ваш файл config.yml будет выглядеть примерно так (используйте любое регулярное выражение, какое захотите).

fos_rest:
    versioning:
        enabled: true
        resolvers:
            media_type: # Accept header
                enabled: true
                regex: '/v(?P<version>[0-9\.]+)\+(json|xml)/'
        guessing_order:
            - media_type # Not needed if there's only one
    format_listener: # Must enable format_listener for versioning in Accept headers
        enabled: true
        rules: # Catch all routes to use this rule
            - { path: '*', priorities: ['json', 'xml'], fallback_format: json, prefer_extension: false }
    view:
        mime_types: # If there are lots of versions, can make this more dynamic. Check docs.
            json: ['application/vnd.company.myapp.customer-v1+xml', 'application/vnd.company.myapp.customer-v2+xml', 'application/vnd.company.myapp.customer-v3+json']
person Katrina    schedule 20.05.2016