GraphQL набирает обороты, а PHP остаётся одним из самых популярных языков для веба. Если вы задумываетесь, как скрестить эти технологии, эта статья для вас. Мы разберём, что такое GraphQL, зачем он нужен в PHP-проектах, и напишем рабочий пример сервера и клиента.
Что такое GraphQL и зачем он PHP-разработчику
GraphQL — это язык запросов к API, разработанный Facebook. В отличие от REST, где вы получаете фиксированный набор данных по каждому эндпоинту, GraphQL позволяет клиенту запросить именно то, что нужно, и ничего лишнего. Это как заказ в ресторане: вы выбираете блюда из меню, а не получаете сразу всё.
Для PHP-разработчика это означает гибкость: один эндпоинт вместо десятка, меньше сетевых запросов, возможность легко комбинировать данные из разных источников. Особенно полезно для мобильных приложений и SPA, где важна экономия трафика.
Устанавливаем GraphQL для PHP
Самый популярный пакет — webonyx/graphql-php. Он предоставляет всё необходимое для создания сервера и выполнения запросов. Установка через Composer:
composer require webonyx/graphql-php
После установки можно приступать к созданию схемы.
Создаём простой GraphQL-сервер на PHP
Схема — это сердце GraphQL-сервера. Она описывает типы данных и доступные запросы. Начнём с примера: сервер будет возвращать информацию о пользователях.
Создадим файл server.php:
<?php
require_once __DIR__ . '/vendor/autoload.php';
use GraphQL\Type\Definition\ObjectType;
use GraphQL\Type\Definition\Type;
use GraphQL\GraphQL;
use GraphQL\GraphQLSchema;
// Определяем тип User
$userType = new ObjectType([
'name' => 'User',
'fields' => [
'id' => Type::int(),
'name' => Type::string(),
'email' => Type::string(),
],
]);
// Корневой запрос
$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;
},
],
],
]);
$schema = new GraphQLSchema([
'query' => $queryType,
]);
// Обрабатываем запрос
$rawInput = file_get_contents('php://input');
$input = json_decode($rawInput, true);
$query = $input['query'];
$variableValues = isset($input['variables']) ? $input['variables'] : null;
$result = GraphQL::executeQuery($schema, $query, null, null, $variableValues);
header('Content-Type: application/json');
echo json_encode($result->toArray());
Теперь можно отправить POST-запрос с телом {"query": "{ user(id: 1) { name email } }"} и получить JSON с данными.
Клиентская часть: делаем запросы из PHP
PHP может выступать не только сервером, но и клиентом GraphQL. Для этого достаточно отправлять HTTP-запросы с помощью cURL или Guzzle. Пример с cURL:
<?php
$query = '
query GetUser($id: Int!) {
user(id: $id) {
name
email
}
}
';
$variables = ['id' => 1];
$payload = json_encode([
'query' => $query,
'variables' => $variables,
]);
$ch = curl_init('http://localhost:8000/server.php');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
print_r($data);
Такой подход удобен для интеграции с внешними GraphQL API, например, с GitHub или Shopify.
Сравнение GraphQL и REST: что выбрать
Чтобы понять, подходит ли GraphQL вашему проекту, взгляните на таблицу:
| Критерий | REST | GraphQL |
|---|---|---|
| Количество эндпоинтов | Много | Один |
| Гибкость запросов | Фиксированный ответ | Клиент выбирает поля |
| Кэширование | Простое (HTTP-кэш) | Сложнее (нужен клиентский кэш) |
| Порог входа | Низкий | Средний (нужно изучить схему) |
GraphQL выигрывает, когда клиентам нужно много разных данных и частые изменения. REST проще для простых API и кэширования.
Практические советы и лайфхаки
- Используйте GraphQL-клиенты (например, GraphiQL) для отладки запросов.
- Ограничивайте сложность запросов, чтобы избежать DoS-атак.
- Кэшируйте результаты на стороне сервера с помощью Redis или Memcached.
- Разбивайте схему на модули для больших проектов.
lighthouse-php для Laravel — он генерирует схему из Eloquent-моделей.
Что в итоге
GraphQL в PHP — это мощный инструмент, который стоит освоить. Он даёт гибкость и эффективность, особенно в проектах с разнообразными клиентами. Начните с простого сервера на webonyx/graphql-php, постепенно усложняя схему. Помните о безопасности и кэшировании. Удачи в экспериментах!



