مكتبة GraphQL في PHP: webonyx/graphql-php
GraphQL هي لغة استعلام حديثة لواجهات برمجة التطبيقات (API)، طورتها فيسبوك. في PHP، واحدة من أشهر وأكثر المكتبات نضجًا لتنفيذ GraphQL هي webonyx/graphql-php. تتيح هذه المكتبة للمطورين إنشاء واجهات برمجة تطبيقات مرنة، ومكتوبة، وفعالة، تمنح العملاء القدرة على طلب البيانات الضرورية فقط.
في هذه المقالة، سنستعرض بالتفصيل كيفية تثبيت وتهيئة واستخدام webonyx/graphql-php في مشروع PHP الخاص بك. المكتبة تنفذ بالكامل المواصفات الرسمية لـ GraphQL (يونيو 2018) وتدعم جميع الإمكانيات الحديثة: الاستعلامات (queries)، التحويرات (mutations)، الاشتراكات (subscriptions)، الواجهات، الاتحادات، وأكثر من ذلك بكثير.
التثبيت والتهيئة
يتم التثبيت عبر Composer. افتح الطرفية في جذر مشروعك ونفذ الأمر التالي:
composer require webonyx/graphql-phpبعد التثبيت، المكتبة جاهزة للاستخدام. لا يلزم أي تهيئة دنيا — فقط قم باستيراد الفئات المطلوبة إلى ملف PHP الخاص بك.
المكونات الأساسية للمكتبة
تتكون المكتبة من عدة مكونات رئيسية تتفاعل مع بعضها البعض:
- المخطط (Schema) — يحدد أنواع البيانات والعمليات المتاحة (الاستعلامات والتحويرات).
- الأنواع (Types) — تصف بنية البيانات (ObjectType، ScalarType، EnumType، InterfaceType، UnionType وغيرها).
- المحللات (Resolvers) — دوال تعيد البيانات لكل حقل.
- المنفذ (Executor) — يعالج الطلب الوارد ويعيد النتيجة.
إنشاء مخطط بسيط
لننظر إلى مثال لإنشاء مخطط GraphQL بسيط للعمل مع المستخدمين. أولاً، نحدد نوع User:
<?phpuse GraphQL\\Type\\Definition\\ObjectType;use GraphQL\\Type\\Definition\\Type;
$userType = new ObjectType([ 'name' => 'User', 'fields' => [ 'id' => Type::int(), 'name' => Type::string(), 'email' => Type::string(), 'age' => Type::int(), ],]);الآن، ننشئ نوع الاستعلام الجذري Query، الذي سيعيد قائمة المستخدمين:
$queryType = new ObjectType([ 'name' => 'Query', 'fields' => [ 'users' => [ 'type' => Type::listOf($userType), 'resolve' => function ($root, $args) { // هنا عادةً استعلام لقاعدة البيانات return [ ['id' => 1, 'name' => 'إيفان إيفانوف', 'email' => 'ivan@example.com', 'age' => 30], ['id' => 2, 'name' => 'ماريا بيتروفا', 'email' => 'maria@example.com', 'age' => 25], ]; }, ], 'user' => [ 'type' => $userType, 'args' => [ 'id' => Type::nonNull(Type::int()), ], 'resolve' => function ($root, $args) { // البحث عن مستخدم بواسطة المعرف $users = [ 1 => ['id' => 1, 'name' => 'إيفان إيفانوف', 'email' => 'ivan@example.com', 'age' => 30], 2 => ['id' => 2, 'name' => 'ماريا بيتروفا', 'email' => 'maria@example.com', 'age' => 25], ]; return $users[$args['id']] ?? null; }, ], ],]);الدمج في مخطط وتنفيذ الاستعلام
الآن، ندمج كل شيء في مخطط واحد وننفذ استعلامًا اختباريًا:
use GraphQL\\GraphQL;use GraphQL\\Schema;
$schema = new Schema([ 'query' => $queryType,]);
// استعلام GraphQL الوارد (عادةً ما يأتي في POST)$query = '{ users { id name em