واجهة برمجة تطبيقات GraphQL مع PHP: دليل تعليمي عملي خطوة بخطوة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة إلى GraphQL مع PHP: لماذا يستحق التجربة

\n\n

GraphQL هي لغة استعلام حديثة لواجهات برمجة التطبيقات (API)، طورتها Facebook. على عكس REST، حيث يعيد كل نقطة نهاية بنية بيانات ثابتة، يسمح GraphQL للعميل بطلب الحقول التي يحتاجها فقط. هذا يقلل من حجم البيانات المنقولة ويبسط تطوير التطبيقات المعقدة.

\n\n

في هذا الدليل التعليمي، سننشئ واجهة برمجة تطبيقات GraphQL كاملة باستخدام PHP مع مكتبة webonyx/graphql-php. ستتعلم كيفية تعريف المخطط، كتابة المحللات، معالجة الاستعلامات والتحويرات، وكذلك اختبار واجهة API عبر GraphiQL.

\n\n

من المفترض أن يكون لديك PHP 8.0+ و Composer مثبتين. إذا لم يكن الأمر كذلك، فابدأ بتثبيتهما.

\n\n

تثبيت المشروع وإعداده

\n\n

الخطوة 1: إنشاء المشروع وتثبيت التبعيات

\n\n

أنشئ دليلاً جديداً للمشروع وقم بتهيئة Composer:

\n\n
mkdir graphql-php-tutorial\ncd graphql-php-tutorial\ncomposer init
\n\n

قم بتثبيت مكتبة webonyx/graphql-php:

\n\n
composer require webonyx/graphql-php
\n\n

قم أيضاً بتثبيت nikic/fast-route لتوجيه بسيط (اختياري ولكنه مفيد):

\n\n
composer require nikic/fast-route
\n\n

الخطوة 2: هيكل المشروع

\n\n

أنشئ هيكل المجلدات التالي:

\n\n
graphql-php-tutorial/\n├── src/\n│   ├── Schema/\n│   │   └── schema.php\n│   ├── Resolvers/\n│   │   ├── QueryResolver.php\n│   │   └── MutationResolver.php\n│   └── Data/\n│       └── Database.php\n├── public/\n│   └── index.php\n├── vendor/\n└── composer.json
\n\n

إنشاء مخطط GraphQL

\n\n

الخطوة 3: تعريف الأنواع والمخطط

\n\n

لننشئ نموذج بيانات بسيط: مستخدم (User) ومنشور (Post). افتح src/Schema/schema.php وأضف الكود التالي:

\n\n
<?php\n\nnamespace App\\Schema;\n\nuse GraphQL\\Type\\Definition\\ObjectType;\nuse GraphQL\\Type\\Definition\\Type;\nuse GraphQL\\Type\\Schema as GraphQLSchema;\n\nclass Schema\n{\n    public static function build(): GraphQLSchema\n    {\n        // نوع User\n        $userType = new ObjectType([\n            'name' => 'User',\n            'fields' => [\n                'id' => Type::int(),\n                'name' => Type::string(),\n                'email' => Type::string(),\n                'posts' => [\n                    'type' => Type::listOf(function() use (&$postType) {\n                        return $postType;\n                    }),\n                    'resolve' => function($user) {\n                        return \\App\\Resolvers\\QueryResolver::getPostsByUser($user['id']);\n                    }\n                ]\n            ]\n        ]);\n\n        // نوع Post\n        $postType = new ObjectType([\n            'name' => 'Post',\n            'fields' => [\n                'id' => Type::int(),\n                'title' => Type::string(),\n                'content' => Type::string(),\n                'author' => [\n                    'type' => $userType,\n                    'resolve' => function($post) {\n                        return \\App\\Resolvers\\QueryResolver::getUserById($post['author_id']);\n                    }\n                ]\n            ]\n        ]);\n\n        // النوع الجذر Query\n        $queryType = new ObjectType([\n            'name' => 'Query',\n            'fields' => [\n                'users' => [\n                    'type' => Type::listOf($userType),\n                    'resolve' => function() {\n                        return \\App\\Resolvers\\QueryResolver::getAllUsers();\n                    }\n                ],\n                'user' => [\n                    'type' => $userType,\n                    'args' => [\n                        'id' => Type::nonNull(Type::int())\n                    ]                

المدونات

توصيات الكتب