Symfony використання FOSRestBundle Хабр

Для роботи нам також знадобиться JMSSerializerBundle для серіалізації даних з Entity в JSON або інші формати, виключення деяких полів для тієї чи іншої сутності (наприклад, пароль для API методу отримання списку користувачів) та багато іншого. Докладніше можете почитати в документації.

Установка та конфігурування1)Завантажуємо потрібні залежності в нашому composer.json

"friendsofsymfony/rest-bundle": "^1.7", "jms/serializer-bundle": "^1.1"

А тепер редагуємо наш config.yml Для початку налаштовуватимемо наш FOSRestBundle

Тепер почнемо налаштування нашого JMSSerializeBundle

Тут має сенс зупинитися на моменті з jms_serializer.metadata.directories, де ми говоримо serializer-у про те, що конфігурація для того чи іншого класу (сутності) знаходиться там чи там :) Умовимося, що нам потрібно вивести весь список користувачів, я особисто використовую FosUserBundle у своїх проектах і ось моя сутність:

Я наводжу як приклад цю сутність, яка успадковується від основної моделі FosUserBundle. Це важливо, тому що обидва класи доведеться конфігурувати для JmsSerializerBundle окремо. Отже, повернемосяjms_serializer.metadata.directories:

Тут ми якраз і вказуємо, що для AppBundle класів ми шукатимемо конфігурацію для серіалізації в app/config/serializer/AppBundle, а для FosUserBundle — в app/config/serializer/FosUserBundle. Конфігурація для класу буде автоматично у форматі:Для класу AppBundle\Entity\User — app/config/serializer/AppBundle/Entity.User.(ymlxmlphp)Для класу базової моделі FosUserBundle — app/config/serializer/FosUserBundle/Model.User.(ymlxmlphp)

Особисто я волію використовувати YAML. Почнемо нарешті розповідати JMSSerializer яким чином нампотрібно, щоб він налаштовував той чи інший клас.app/config/serializer/AppBundle/Entity.User.yml

Ось так просто ми змогли розповісти, що хочемо бачити приблизно наступний формат відповіді від сервера при отриманні даних від 1 користувача:

У принципі цю конфігурацію необов'язково прописувати і сервер повертатиме всі дані про сутність. Тільки в даному випадку нам нелогічно показувати багато речей, наприклад такі, як пароль. Тому я вважав за потрібне продемонструвати в цьому прикладі саме таку реалізацію.

Тепер приступимо до створення контролераНасамперед створимо роут:

Зверніть увагу на /api - не забувайте додавати його, а якщо хочете змінити, то доведеться змінювати конфігурацію для fos_rest в config.yml

Тепер сам BackendUserBundle/Resources/config/routing.yml:

Тепер можна приступати до створення самого контролера:

Зауважимо, що успадковуємося ми тепер відFOS\RestBundle\Controller\FOSRestController. До речі, ви напевно звернули увагу на інструкцію View (serializerGroups=). Справа в тому, що т.к. ми хочемо бачити і дані App\Entity\User і основний моделі FosUserBundle, у якій зберігаються й інші поля, ми маємо створити певну групу, у разі — «user».

Отже, у нас є 2 екшени getUserAction та getUsersAllAction. Зараз ви зрозумієте суть специфіки назв методів контролера. Зробимо debug всіх роутів: $ app/console debug:route grep api Отримуємо:

Розглянемо наступний приклад із новими методами:

Нагадує Laravel Resource Controller, правда?