مكتبة 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 هو المخطط الذي يحدد أنواع البيانات وعلاقاتها المتبادلة. لنلق نظرة على مثال لإنشاء مخطط بسيط لجلب قائمة المستخدمين.
<?phpuse 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);العمل مع الطفرات (Mutations)
بالإضافة إلى الاستعلامات (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 ويوفر