GraphQL в PHP: библиотеки webonyx/graphql-php и Lighthouse для создания API

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

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

Начать курс

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

GraphQL — это язык запросов для API, который позволяет клиентам запрашивать только необходимые данные. В экосистеме PHP основной библиотекой для реализации GraphQL является webonyx/graphql-php. Она предоставляет полный набор инструментов для создания схем, типов и резолверов. Для фреймворка Laravel существует пакет Lighthouse, который расширяет возможности graphql-php и упрощает разработку.

Установка webonyx/graphql-php

Установка производится через Composer:

composer require webonyx/graphql-php

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

Основой GraphQL является схема, которая определяет типы данных и их взаимосвязи. Рассмотрим пример создания простой схемы для получения списка пользователей.

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

// Определяем тип User
$userType = new ObjectType([
    'name' => 'User',
    'fields' => [
        'id' => Type::int(),
        'name' => Type::string(),
        'email' => Type::string(),
    ]
]);

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

// Создаём схему
$schema = new Schema([
    'query' => $queryType
]);

// Выполняем запрос
$rawInput = file_get_contents('php://input');
$input = json_decode($rawInput, true);
$query = $input['query'];
$result = GraphQL::executeQuery($schema, $query);
$output = $result->toArray();

header('Content-Type: application/json');
echo json_encode($output);

Работа с мутациями

Помимо запросов (Query), GraphQL поддерживает мутации (Mutation) для изменения данных. Пример создания мутации для добавления пользователя:

<?php
// Определяем тип мутации
$mutationType = new ObjectType([
    'name' => 'Mutation',
    'fields' => [
        'addUser' => [
            'type' => $userType,
            'args' => [
                'name' => Type::nonNull(Type::string()),
                'email' => Type::nonNull(Type::string())
            ],
            'resolve' => function ($root, $args) {
                // Здесь должен быть код для сохранения в БД
                return [
                    'id' => 3,
                    'name' => $args['name'],
                    'email' => $args['email']
                ];
            }
        ]
    ]
]);

// Обновляем схему
$schema = new Schema([
    'query' => $queryType,
    'mutation' => $mutationType
]);

Использование Lighthouse для Laravel

Если вы работаете с Laravel, рекомендуется использовать Lighthouse. Он автоматизирует создание схемы на основе Eloquent моделей и предоставляет удобные аннотации.

Установка Lighthouse:

composer require nuwave/lighthouse

Пример определения схемы в файле graphql/schema.graphql:

type User {
    id: ID!
    name: String!
    email: String!
    posts: [Post!]! @hasMany
}

type Query {
    users: [User!]! @all
    user(id: ID! @eq): User @find
}

type Mutation {
    createUser(name: String!, email: String!): User! @create
}

Lighthouse автоматически генерирует резолверы на основе аннотаций (@all, @find, @create

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