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, правда?