GraphQL مقابل REST في PHP: أيهما تختار لـ API في 2024؟

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

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

ابدأ الدورة

مقدمة: REST أم GraphQL — معركة أبدية بين السرعة والمرونة

\n

مرحباً أيها المطور! إذا كنت قد كتبت API على PHP ولو مرة واحدة، فبالتأكيد واجهت المعضلة: استخدام REST الكلاسيكي أم GraphQL الحديث. كلا النهجين يحلان مشكلة واحدة — نقل البيانات بين العميل والخادم، لكنهما يفعلان ذلك بطرق مختلفة جذرياً.

\n

كان REST لسنوات طويلة المعيار الفعلي: بسيط، واضح، قابل للتوقع. ولكن مع تزايد تعقيد الواجهات الأمامية (React، Vue، التطبيقات المحمولة)، يشتكي المطورون بشكل متزايد من overfetching (بيانات كثيرة جداً في الاستجابة) و underfetching (الحاجة إلى عدة طلبات لجمع المعلومات المطلوبة). هنا يظهر GraphQL على المسرح — لغة استعلامات تمنح العميل التحكم في البيانات التي يريد الحصول عليها بالضبط.

\n

في هذه المقالة، لن نقوم فقط بسرد النظريات. سنأخذ مشاريع PHP حقيقية (Laravel و Symfony)، ونكتب كوداً ونرى ما هو الأسرع وما هو الأكثر راحة. هيا بنا!

\n\n

1. REST API في PHP: الكلاسيكية التي لا تموت

\n

كيف يعمل

\n

REST (نقل الحالة التمثيلية) هو نمط معماري حيث يكون لكل مورد (مستخدم، مقال، تعليق) عنوان URL خاص به. يرسل العميل طلبات HTTP (GET، POST، PUT، DELETE)، ويعيد الخادم بنية بيانات ثابتة، عادةً بصيغة JSON.

\n

مثال على نقطة نهاية REST نموذجية على PHP (بدون إطار عمل):

\n
// index.php - REST API بسيط\nheader('Content-Type: application/json');\n\n$method = $_SERVER['REQUEST_METHOD'];\n$uri = $_SERVER['REQUEST_URI'];\n\nif ($method === 'GET' && $uri === '/api/users') {\n    $users = [\n        ['id' => 1, 'name' => 'أليكسي', 'email' => 'alex@example.com'],\n        ['id' => 2, 'name' => 'ماريا', 'email' => 'maria@example.com']\n    ];\n    echo json_encode($users);\n}\n
\n

في Laravel يبدو الأمر أبسط:

\n
// routes/api.php\nRoute::get('/users', function () {\n    return User::all(); // يتم تسلسلها تلقائياً إلى JSON\n});\n
\n

إيجابيات REST

\n
    \n
  • سهولة التخزين المؤقت: التخزين المؤقت لـ HTTP (ETag, Last-Modified) يعمل بشكل فوري.
  • \n
  • سهولة التصحيح: أي متصفح أو curl يعرض الاستجابة.
  • \n
  • الاستقرار: REST موجود منذ عام 2000، والوثائق والأدوات (Postman, Swagger) مصقولة بشكل ممتاز.
  • \n
\n

سلبيات REST

\n
    \n
  • Overfetching: إذا كان العميل يحتاج فقط إلى اسم المستخدم، فسيظل يحصل على البريد الإلكتروني ورقم الهاتف والعنوان.
  • \n
  • مشكلة N+1: للحصول على مستخدم ومنشوراته، تحتاج إلى طلبين (GET /users/1, GET /users/1/posts).
  • \n
\n\n

2. GraphQL في PHP: عندما يكون العميل هو الملك

\n

كيف يعمل

\n

GraphQL ليس قاعدة بيانات، بل هو طبقة بين العميل والخادم. يرسل العميل طلب POST إلى نقطة نهاية واحدة (عادةً /graphql) مع جسم الطلب الذي يصف فيه الحقول والعلاقات التي يحتاجها. يعيد الخادم بالضبط ما تم طلبه — لا بايت إضافي.

\n

مثال على التنفيذ على PHP باستخدام مكتبة webonyx/graphql-php:

\n
// schema.php\nuse GraphQL\\Type\\Definition\\ObjectType;\nuse GraphQL\\Type\\Definition\\Type;\n\n$userType = new ObjectType([\n    'name' => 'User',\n    'fields' => [\n        'id' => Type::int(),\n        'name' => Type::string(),\n        'email' => Type::string(),\n    ]\n]);\n\n$queryType = new ObjectType([\n    'name' => 'Query',\n    'fields' => [\n        'user' => [\n            'type' => $userType,\n            'args' => ['id' => Type::int()],\n            'resolve' => function ($root, $args) {\n                return findUserById($args['id']); // منطقك الخاص\n            }\n        ]\n    ]\n]);\n
\n

والآن طلب من العميل:

\n
// طلب                

المدونات

توصيات الكتب