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