مكتبة GraphQL لـ PHP: webonyx/graphql-php
في تطوير الويب الحديث، تظهر الحاجة بشكل متزايد إلى واجهات برمجة تطبيقات (API) مرنة وفعالة. غالبًا ما تعاني خدمات REST التقليدية من تحميل زائد أو غير كافٍ للبيانات. GraphQL هي لغة استعلام وبيئة تشغيل تم إنشاؤها بواسطة Facebook، وتتيح للعملاء طلب البيانات التي يحتاجونها بالضبط. بالنسبة للغة PHP، واحدة من أشهر التطبيقات هي مكتبة webonyx/graphql-php.
توفر هذه المكتبة مجموعة كاملة من الأدوات لبناء خوادم GraphQL بلغة PHP: بدءًا من تعريف مخطط الأنواع وصولاً إلى معالجة الاستعلامات المعقدة ذات العلاقات المتداخلة. إنها مثالية لإنشاء واجهات برمجة تطبيقات حديثة لتطبيقات الويب وتطبيقات الجوال وتطبيقات الصفحة الواحدة (SPA).
الميزات الرئيسية لـ webonyx/graphql-php
- دعم كامل لمواصفات GraphQL (يونيو 2018) — جميع الأنواع، التوجيهات، المتغيرات والأجزاء.
- نظام أنواع قائم على كائنات PHP — تعريف الأنواع، الواجهات، أنواع الاتحاد والتعداد.
- محللات مدمجة — إمكانية تحديد منطق جلب البيانات لكل حقل.
- التحقق من صحة الاستعلامات — فحص تلقائي للصياغة والأنواع.
- دعم التحميل البطيء — يتم تحميل البيانات فقط عند الطلب.
- التوافق مع الأطر الشائعة — Laravel، Symfony، Yii2 من خلال حزم التغليف.
التثبيت والإعداد
يتم التثبيت عبر Composer:
composer require webonyx/graphql-phpيتطلب التشغيل PHP 7.1+ مع إضافة mbstring. بعد التثبيت، سنقوم بإنشاء خادم بسيط.
مثال: إنشاء مخطط GraphQL
لننظر إلى مثال أساسي — جلب قائمة الكتب والمؤلفين. أولاً، نحدد الأنواع:
<?phpuse GraphQL\\Type\\Definition\\ObjectType;use GraphQL\\Type\\Definition\\Type;use GraphQL\\Type\\Schema;
// نوع "Author"$authorType = new ObjectType([ 'name' => 'Author', 'fields' => [ 'id' => Type::int(), 'name' => Type::string(), 'books' => [ 'type' => Type::listOf($bookType), // سيتم تعريفه أدناه 'resolve' => function ($author) { // لنفترض وجود دالة getBooksByAuthorId() return getBooksByAuthorId($author['id']); } ] ]]);
// نوع "Book" (نحدده باستخدام إغلاق للمراجع الدائرية)$bookType = new ObjectType([ 'name' => 'Book', 'fields' => function() use ($authorType) { return [ 'id' => Type::int(), 'title' => Type::string(), 'author' => [ 'type' => $authorType, 'resolve' => function ($book) { return getAuthorById($book['author_id']); } ] ]; }]);
// نوع "Query"$queryType = new ObjectType([ 'name' => 'Query', 'fields' => [ 'books' => [ 'type' => Type::listOf($bookType), 'resolve' => function() { return getAllBooks(); } ], 'author' => [ 'type' => $authorType, 'args' => [ 'id' => Type::nonNull(Type::int()) ], 'resolve' => function($root, $args) { return getAuthorById($args['id']); } ] ]]);
// إنشاء المخطط$schema = new Schema([ 'query' => $queryType]);معالجة الاستعلام
الآن سنكتب الكود الذي يستقبل استعلام GraphQL ويعيد النتيجة:
<?phpuse GraphQL\\GraphQL;use GraphQL\\Error\\DebugFlag;
// الحصول على نص الاستعلام من الإدخال