GraphQL набирает обороты, а PHP остаётся одним из самых популярных языков для веба. Если вы задумываетесь, как скрестить эти технологии, эта статья для вас. Мы разберём, что такое GraphQL, зачем он нужен в PHP-проектах, и напишем рабочий пример сервера и клиента.

Digital-студия WNDER

Что такое 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 с данными.

Правило: Всегда валидируйте входящие GraphQL-запросы. Используйте встроенные механизмы валидации из библиотеки, чтобы избежать ошибок и потенциальных атак.

Клиентская часть: делаем запросы из 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, постепенно усложняя схему. Помните о безопасности и кэшировании. Удачи в экспериментах!

Студия WNDER