GraphQL сервер на php. Интеграция с Symfony 4

Вы уже наверное неоднократно слышали про новый язык запросов graphQL. Он по сути является заменой традиционному REST и RPC исправляя их недостатки, при этом оставаясь таким же гибким для облачных приложений.

Сами создатели данного языка называют graphQL языком запросов для вашего API, гибким и мощным. Основным преимуществом данной технологии является то, что вы запрашиваете у приложения только то, что вам необходимо в конкретный момент времени, поддерживаются вложенные запросы и хорошая интеграция c фронтом.

GraphQL. Интеграция с 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, каждый шаг оформлен в качестве отдельного коммита.

Если вам помогла статья, пожалуйста перейдите по одному из рекламных блоков, расположенных на сайте. Таким образом вы поддержите проект. Спасибо

© Krenar 2020. All right reserved.