GraphQL مقابل REST في PHP: أيهما تختار لمشروعك في 2024؟

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

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

ابدأ الدورة

GraphQL مقابل REST في PHP: حرب بين البنيات أم أدوات لمهام مختلفة؟

\n\n

عندما تفتح محرر الأكواد مرة أخرى لكتابة نقطة نهاية جديدة لتطبيق PHP الخاص بك، يراودك شعور بالتكرار. هل ستنشئ وحدة تحكم جديدة؟ هل ستكتب التحقق من الصحة مرة أخرى؟ أم حان الوقت لتجربة شيء جديد؟ الجدل بين GraphQL و REST في عالم تطوير PHP يشبه الجدل الأبدي بين "لارافيل" و "سيمفوني" — كل يدافع عن مجموعته التقنية حتى بحة الصوت. لكن لنكن صادقين: كلا النهجين ليسا دينًا، بل أدوات. واليوم سنقوم بتفكيكهما إلى قطع صغيرة، ونلقي نظرة على كود حقيقي، ونقرر متى يكون REST API في PHP هو خيارك، ومتى يجب أن تفكر في GraphQL في PHP.

\n\n

نبذة سريعة: ما هو كل منهما؟

\n\n

REST (Representational State Transfer) هو أسلوب معماري مبني على مبادئ الموارد وطرق HTTP. تطلب /api/users، تحصل على قائمة المستخدمين. تريد مستخدمًا واحدًا؟ أضف /api/users/42. كل شيء منطقي، متوقع، وتقليدي.

\n\n

GraphQL هي لغة استعلامات أنشأها فيسبوك. أنت غير مقيد بعناوين URL. ترسل طلبًا واحدًا إلى نقطة نهاية واحدة (مثل /graphql) وتقول: "أعطني اسم المستخدم رقم 42، وآخر 5 منشوراته، وعدد الإعجابات تحت كل منها". يعيد الخادم بالضبط ما طلبت. لا بايت إضافي واحد.

\n\n

قد يبدو أن GraphQL هو الفائز بالنقاط. لكن لا تتعجل في التخلص من REST القديم الجيد. لكل منهما عيوبه الخفية، خاصة في سياق التطوير باستخدام PHP.

\n\n

مقارنة البنيات: من النظرية إلى الكود

\n\n

REST: الكلاسيكي الأصيل

\n\n

في PHP، يتم تنفيذ REST من خلال التوجيه. أطر العمل مثل Laravel أو Symfony تفعل ذلك بأناقة. مثال على وحدة تحكم REST نموذجية في Laravel:

\n\n
<?php\n\nnamespace App\\Http\\Controllers\\Api;\n\nuse App\\Models\\User;\nuse Illuminate\\Http\\Request;\n\nclass UserController extends Controller\n{\n    public function index()\n    {\n        return User::all();\n    }\n\n    public function show($id)\n    {\n        $user = User::with('posts.comments')->findOrFail($id);\n        return response()->json($user);\n    }\n\n    public function store(Request $request)\n    {\n        $validated = $request->validate([\n            'name' => 'required|string',\n            'email' => 'required|email|unique:users',\n        ]);\n\n        $user = User::create($validated);\n        return response()->json($user, 201);\n    }\n}
\n\n

المزايا واضحة: سهولة التخزين المؤقت (ذاكرة التخزين المؤقت HTTP، Varnish)، هيكل URL مفهوم، دعم واسع من الأدوات (Postman، Swagger). العيوب — مشكلة over-fetching و under-fetching. إذا كانت الواجهة الأمامية تحتاج فقط إلى أسماء المستخدمين، وأنت تسحب جميع حقول النموذج في الرد — فهذا over-fetching. إذا كنت بحاجة إلى الاسم وقائمة الأصدقاء، وتقوم بعمل طلبين — فهذا under-fetching.

\n\n

GraphQL: المرونة مع خدعة

\n\n

لتنفيذ GraphQL في PHP، هناك مكتبات ممتازة: webonyx/graphql-php (PHP نقي) و lighthouse-php/lighthouse (لـ Laravel). مثال على مخطط ومحلل باستخدام graphql-php:

\n\n
<?php\n\nuse GraphQL\\GraphQL;\nuse GraphQL\\Type\\Definition\\ObjectType;\nuse GraphQL\\Type\\Definition\\Type;\nuse GraphQL\\Type\\Schema;\n\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($postType),\n            'resolve' => function ($user) {\n                return getPostsByUserId($user['id']);\n            }\n        ],\n    ],\n]);\n\n$queryType = new ObjectType([\n    'name' => 'Query',\n    'fields' => [\n        'user' => [\n            'type' => $userType,\n            'args' => [\n                

المدونات

توصيات الكتب