GraphQL vs REST PHP: आर्किटेक्चर की जंग या अलग-अलग कामों के उपकरण?
\n\nजब आप अपने PHP एप्लिकेशन के लिए एक नया एंडपॉइंट लिखने के लिए कोड एडिटर खोलते हैं, तो आपको एक अजीब सा डेजा वू महसूस होता है। फिर से कंट्रोलर बनाना? फिर से वैलिडेशन लिखना? या शायद कुछ नया आज़माने का समय आ गया है? PHP डेवलपमेंट की दुनिया में GraphQL और REST के बीच बहस 'लारावेल' और 'सिम्फनी' के बीच की पुरानी बहस जैसी है - हर कोई अपने स्टैक को जोर-शोर से डिफेंड करता है। लेकिन ईमानदारी से कहें तो: दोनों ही दृष्टिकोण कोई धर्म नहीं, बल्कि उपकरण हैं। और आज हम इन्हें पूरी तरह से समझेंगे, असली कोड देखेंगे और तय करेंगे कि कब PHP पर REST API आपकी पसंद है और कब PHP में GraphQL पर ध्यान देना चाहिए।
\n\nसंक्षिप्त परिचय: क्या है क्या?
\n\nREST (Representational State Transfer) एक आर्किटेक्चरल शैली है जो संसाधनों और HTTP विधियों के सिद्धांतों पर आधारित है। आप /api/users पर हिट करते हैं, यूजर्स की लिस्ट मिलती है। एक यूजर चाहिए? /api/users/42 जोड़ें। सब कुछ तार्किक, अनुमानित और सरल है।
GraphQL एक क्वेरी भाषा है जिसे Facebook ने बनाया है। आप URL से बंधे नहीं हैं। आप एक ही एंडपॉइंट (जैसे /graphql) पर एक रिक्वेस्ट भेजते हैं और कहते हैं: "मुझे यूजर 42 का नाम, उसके आखिरी 5 पोस्ट और हर पोस्ट पर लाइक्स की संख्या दो।" सर्वर ठीक वही लौटाता है जो आपने मांगा। एक बाइट भी ज्यादा नहीं।
लगता है GraphQL अंकों में जीत गया? लेकिन पुराने अच्छे REST को अभी न छोड़ें। PHP में डेवलपमेंट के संदर्भ में, दोनों के अपने-अपने नुकसान हैं।
\n\nआर्किटेक्चर तुलना: सिद्धांत से कोड तक
\n\nREST: क्लासिक शैली
\n\nPHP में REST रूटिंग के माध्यम से लागू किया जाता है। Laravel या Symfony जैसे फ्रेमवर्क इसे बहुत अच्छे से करते हैं। Laravel पर एक सामान्य REST कंट्रोलर का उदाहरण:
\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\nGraphQL: एक चाल के साथ लचीलापन
\n\nPHP पर GraphQL लागू करने के लिए बेहतरीन लाइब्रेरीज़ हैं: 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