مقدمة في GraphQL و PHP
GraphQL هي لغة استعلام لواجهات API وبيئة تشغيل لتنفيذ هذه الاستعلامات مع البيانات الموجودة. على عكس REST، حيث تحصل على هيكل استجابة ثابت، تسمح GraphQL للعميل بطلب البيانات التي يحتاجها فقط. وهذا يجعل API أكثر مرونة وكفاءة.
في هذا الدليل، سنقوم بإنشاء GraphQL API بسيط باستخدام PHP من الصفر. ستتعلم كيفية تثبيت المكتبات الضرورية، تعريف المخطط، كتابة المحللات، ومعالجة الاستعلامات. المقالة موجهة للمطورين المبتدئين الذين لديهم معرفة أساسية بـ PHP وقواعد البيانات (مثل MySQL أو SQLite).
سنستخدم مكتبة webonyx/graphql-php - وهي الحزمة الأكثر شيوعًا واستقرارًا لتطبيق GraphQL في PHP. في النهاية، ستتمكن من تشغيل خادم GraphQL الخاص بك وإرسال الاستعلامات إليه عبر أي عميل HTTP (مثل cURL أو Insomnia).
تثبيت وإعداد المشروع
الخطوة 1: إنشاء المشروع وتثبيت التبعيات
أولاً، سنقوم بإنشاء مجلد جديد للمشروع وتهيئة Composer:
mkdir graphql-php-tutorialcd graphql-php-tutorialcomposer initثم نقوم بتثبيت مكتبة webonyx/graphql-php:
composer require webonyx/graphql-phpسنحتاج أيضًا إلى خادم HTTP متوافق مع PSR-7. للتبسيط، سنستخدم خادم PHP المدمج ومكتبة guzzlehttp/psr7 للتعامل مع الطلبات والاستجابات:
composer require guzzlehttp/psr7الخطوة 2: هيكل المشروع
أنشئ هيكل الملفات التالي:
index.php- نقطة الدخول للتطبيقschema.graphql- ملف تعريف مخطط GraphQLresolvers.php- ملف دوال المحللاتdata.php- محاكاة قاعدة البيانات (مصفوفة بيانات)
تعريف مخطط GraphQL
الخطوة 3: كتابة المخطط
المخطط هو وصف لأنواع البيانات والعمليات المتاحة (الاستعلامات والتحولات). سننشئ مخططًا بسيطًا لإدارة قائمة الكتب. افتح ملف schema.graphql وأدخل الكود التالي:
type Book { id: ID! title: String! author: String! year: Int}
type Query { books: [Book] book(id: ID!): Book}
type Mutation { addBook(title: String!, author: String!, year: Int): Book deleteBook(id: ID!): Book}هنا قمنا بتعريف:
- Book - نوع بيانات يحتوي على الحقول id و title و author و year.
- Query - عمليات جلب البيانات: قائمة بجميع الكتب وكتاب حسب المعرف.
- Mutation - عمليات تعديل البيانات: إضافة وحذف كتاب.
الخطوة 4: إعداد البيانات والمحللات
أنشئ ملف data.php يحتوي على مصفوفة الكتب:
<?php$books = [ 1 => ['id' => 1, 'title' => 'الحرب والسلام', 'author' => 'ليو تولستوي', 'year' => 1869], 2 => ['id' => 2, 'title' => 'الجريمة والعقاب', 'author' => 'فيودور دوستويفسكي', 'year' => 1866],];الآن سنكتب المحللات في ملف resolvers.php. المحللات هي دوال تقوم بإرجاع البيانات لكل حقل في المخطط.
<?phprequire 'data.php';
function resolveBooks() { global $books; return array_values($books);}
function resolveBook($root, $args) { global $books; return $books[$args['id']] ?? null;}
function resolveAddBook($root, $args) { global $books; $newId = count($books) + 1; $newBook = [ 'id' => $newId, 'title' => $args['title'], 'author' => $args['author'], 'year' => $args['year'] ?? null ]; $books[$newId] = $newBook; return $newBook;}
function resolveDeleteBook($root, $args) { global $books;