GraphQL в PHP: Полное руководство по библиотеке webonyx/graphql-php

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

GraphQL библиотека PHP: webonyx/graphql-php

GraphQL — это современный язык запросов для API, разработанный Facebook. В PHP одной из самых популярных и зрелых библиотек для реализации GraphQL является webonyx/graphql-php. Эта библиотека позволяет разработчикам создавать гибкие, типизированные и эффективные API, которые дают клиентам возможность запрашивать только необходимые данные.

В этой статье мы подробно рассмотрим, как установить, настроить и использовать webonyx/graphql-php на вашем PHP-проекте. Библиотека полностью реализует официальную спецификацию GraphQL (June 2018) и поддерживает все современные возможности: запросы (queries), мутации (mutations), подписки (subscriptions), интерфейсы, объединения и многое другое.

Установка и настройка

Установка осуществляется через Composer. Откройте терминал в корне вашего проекта и выполните:

composer require webonyx/graphql-php

После установки библиотека готова к использованию. Минимальная конфигурация не требуется — просто импортируйте нужные классы в ваш PHP-файл.

Основные компоненты библиотеки

Библиотека состоит из нескольких ключевых компонентов, которые взаимодействуют друг с другом:

  • Схема (Schema) — определяет типы данных и доступные операции (запросы и мутации).
  • Типы (Types) — описывают структуру данных (ObjectType, ScalarType, EnumType, InterfaceType, UnionType и др.).
  • Резолверы (Resolvers) — функции, которые возвращают данные для каждого поля.
  • Исполнитель (Executor) — обрабатывает входящий запрос и возвращает результат.

Создание простой схемы

Рассмотрим пример создания простой GraphQL схемы для работы с пользователями. Сначала определим тип User:

<?php
use GraphQL\Type\Definition\ObjectType;
use GraphQL\Type\Definition\Type;

$userType = new ObjectType([
    'name' => 'User',
    'fields' => [
        'id' => Type::int(),
        'name' => Type::string(),
        'email' => Type::string(),
        'age' => Type::int(),
    ],
]);

Теперь создадим корневой тип запросов Query, который будет возвращать список пользователей:

$queryType = new ObjectType([
    'name' => 'Query',
    'fields' => [
        'users' => [
            'type' => Type::listOf($userType),
            'resolve' => function ($root, $args) {
                // Здесь обычно запрос к базе данных
                return [
                    ['id' => 1, 'name' => 'Иван Иванов', 'email' => 'ivan@example.com', 'age' => 30],
                    ['id' => 2, 'name' => 'Мария Петрова', 'email' => 'maria@example.com', 'age' => 25],
                ];
            },
        ],
        'user' => [
            'type' => $userType,
            'args' => [
                'id' => Type::nonNull(Type::int()),
            ],
            'resolve' => function ($root, $args) {
                // Поиск пользователя по ID
                $users = [
                    1 => ['id' => 1, 'name' => 'Иван Иванов', 'email' => 'ivan@example.com', 'age' => 30],
                    2 => ['id' => 2, 'name' => 'Мария Петрова', 'email' => 'maria@example.com', 'age' => 25],
                ];
                return $users[$args['id']] ?? null;
            },
        ],
    ],
]);

Объединение в схему и выполнение запроса

Теперь объединим все в единую схему и выполним тестовый запрос:

use GraphQL\GraphQL;
use GraphQL\Schema;

$schema = new Schema([
    'query' => $queryType,
]);

// Входящий GraphQL запрос (обычно приходит в POST)
$query = '{ users { id name email } }';

try {
    $result = GraphQL::executeQuery($schema, $query);
    $output = $result->toArray();
} catch (\Exception $e) {
    $output = [
        'errors' => [
            ['message' => $e->getMessage()],
        ],
    ];
}

// Возвращаем JSON
header('Content-Type: application/json');
echo json_encode($output);

Результат выполнения будет выглядеть так:

{
  "data": {
    "users": [
      {"id": 1, "name": "Иван Иванов", "email":                    

Рекомендаций