PHP. Создание GraphQL приложения на Symfony 4
Вы уже наверное неоднократно слышали про новый язык запросов graphQL. Он по сути является заменой традиционному REST и RPC исправляя их недостатки, при этом оставаясь таким же гибким для облачных приложений.
Сами создатели данного языка называют graphQL языком запросов для вашего API, гибким и мощным. Основным преимуществом данной технологии является то, что вы запрашиваете у приложения только то, что вам необходимо в конкретный момент времени, поддерживаются вложенные запросы и хорошая интеграция c фронтом.
Давайте попробуем написать GraphQL приложение на PHP с помощью фреймворка Symfony 4.
Так как тема интересная и актуальная, хочу поделится своим и опытом команды по данной теме 🍿
В начале 2018 года начали писать новый проект и одним из вопросов был, как мы будем взаимодействовать с фронтом. Решили мы данный вопрос достаточно быстро ⬇⬇⬇
На фронте для работы с graphQL спецификацией существует замечательная библиотека от Apollo для реализации graphQL клиента . Для бэкенда мы реализуем graphQL сервер на PHP 7. Так как будущее приложение "полный enterprise", то в качестве фреймворка твердо решили использовать Symfony 4 👽. Осталось найти библиотеку которая позволила бы нам реализовать на беке graphQL сервер.
Таких кандидатов было всего 2:
После некоторых изысканий, выбор пал на второй вариант от вендора overblog. Выбрали мы данный бандл из-за хорошей поддержки всех фич и компонентов семейства symfony 4, в особенности DI контейнера из коробки 😍
И так начнем! 🚀
Создадим graphQL сервер с помощью фреймворка symfony 4 и бандла overblog.
Для начала работы вам необходимо скачать и установить:
- php версии не ниже 7.1
- менеджер зависимостей composer
Далее скачиваем skeleton проект из packagist.org:
composer create-project symfony/skeleton symfony-graphql-server
Переходим в созданную директорию symfony-graphql-server
cd symfony-graphql-server
Добавим бандл overblog/GraphQLBundle
composer require overblog/graphql-bundle
Для работы нам необходимо определить сущности с которыми будет работать наша будущая система. Вообще работа с graphQL очень похожа на написание sql запросов. Иногда кажется, что развитие разработки идет спиралевидно.
Опеределим сущность-тип User (пользователь). Для этого в папке config/graphql/types/Domain создадим файл User.type.yml . Обратите внимание все обязательные поля помечаются через "!". Например поля username и email обязательны для отображения "String!", а поле phone нет "String". Кроме типа поля String существует ряд других типов, подробнее здесь.
В graphQL спецификации существует две операций над сущностями:
- Query (получение данных)
- Mutations (изменение данных)
Если брать в сравнении REST, то Query - GET запрос, а Mutations - POST, PUT, DELETE запросы.
Создадим запрос для получения данных об пользователе и списке пользователей. За все запросы к graphql серверу ответчает файл config/graphql/types/Query.yml
Осталось только создать UserResolver для поддержки получения данных об пользователе/пользователях в коде. Подключение к БД для облегчения восприятия на данном этапе не стал реализовывать. И да вместо контроллеров, теперь используем резолверы.
Вместе с бандлом можно установить очень удобную библиотеку для работы с graphQL схемой, которая пригодится как для разработчиков, так и для тестировщиков.
composer require symfony/web-server-bundle --dev
Для быстрого запуска без настройки локального веб сервера, можно воспользоваться встроенным в php веб сервером. Для этого необходимо установить WebServerBundle бандл.
composer require symfony/web-server-bundle --dev
Осталось запустить встроенный веб сервер с помощью команды:
php bin/console server:run
Перейдем по адресу http://127.0.0.1:8000/graphiql . Если сделали все правильно, то увидите страницу для работы с graphql схемой.
Сделаем запрос по получению данных по пользователю с идентификатором 1:
И запрос по получению данных по всем пользователям:
Обратите внимание что при работе с graphQL схемами, Вы сами выбираете какие вам поля нужны в конкретный момент времени.
Если у вас, что либо не получилось, вы всегда можете скачать репозиторий symfony-graphql-server, каждый шаг оформлен в качестве отдельного коммита.
Также можете сравнить подход к созданию Restful приложения на основе Symfony в статье "Symfony 4. Создание RESTful приложения"
Если вам помогла статья, пожалуйста перейдите по одному из рекламных блоков, расположенных на сайте. Таким образом вы поддержите проект. Спасибо