مقدمة: لماذا يحتاج مشروع PHP الخاص بك إلى بوابة API
\n\nتخيل أنك تبني تطبيق ويب حديث. لديك خدمة مستخدمين على Laravel، وخدمة طلبات على Symfony، وخدمة دفع على PHP خالص، بالإضافة إلى تكاملات خارجية مع CRM وبوت تيليجرام. العملاء (تطبيق جوال، SPA على React، وموقع jQuery قديم) يتصلون بنقاط نهاية مختلفة، ويختلط عليهم الأمر في الرموز المميزة، وأنت تصلح مشاكل CORS كل أسبوع.
\n\nهل يبدو هذا مألوفًا؟ إذا كان الأمر كذلك، فأنت بحاجة إلى API Gateway — نقطة دخول موحدة لجميع خدماتك. إنه ليس مجرد بروكسي، بل مدير حقيقي يتولى التوجيه، التوثيق، التخزين المؤقت، وتجميع البيانات.
\n\nفي هذه المقالة، سنشرح كيفية كتابة API Gateway بسيط لكن عملي بلغة PHP يمكن نشره على أي استضافة. لا سحر، فقط كود نقي وأفضل الممارسات لـ بنية الميكروسيرفيس في PHP.
\n\nما هو API Gateway ولماذا يحتاجه مطور PHP
\n\nAPI Gateway (بوابة API) هو خادم يستقبل جميع الطلبات الواردة من العملاء ويعيد توجيهها إلى الميكروسيرفيس المناسبة. العميل لا يعرف شيئًا عن البنية الداخلية: فهو ببساطة يرسل طلبًا إلى /api/users، وتقرر البوابة بنفسها إلى أين ترسله.
المهام الرئيسية للبوابة:
\n- \n
- التوجيه — إعادة توجيه الطلبات إلى خدمات مختلفة بناءً على URL أو الرؤوس. \n
- التوثيق والتفويض — التحقق من رموز JWT، مفاتيح API، وتقييد الوصول. \n
- التجميع — دمج البيانات من عدة خدمات في رد واحد (مثل: ملف المستخدم + آخر طلباته). \n
- التخزين المؤقت — تقليل الحمل على الخلفية باستخدام ذاكرة تخزين مؤقت للبيانات المطلوبة بشكل متكرر. \n
- تحديد المعدل — الحماية من هجمات DDoS وزيادة التحميل على الخدمات. \n
- تحويل الردود — توحيد تنسيق البيانات لعملاء مختلفين. \n
المزايا واضحة: تبسيط الجزء العميل، إدارة أمن مركزية، وإمكانية تغيير الخلفية دون إبلاغ العملاء. العيب هو نقطة فشل إضافية، ولكن يمكن حل ذلك بتكرار البوابة.
\n\nتصميم API Gateway بسيط بلغة PHP
\n\nسنكتب بوابة باستخدام PHP خالص بدون أطر عمل، حتى تفهم الجوهر. لكن يمكنك بسهولة تكييف الكود مع Laravel أو Symfony أو Slim.
\n\nبوابتنا ستقوم بـ:
\n- \n
- استقبال الطلبات على
/api/users/*وإعادة توجيهها إلى خدمة Users (المنفذ 8081) \n - استقبال الطلبات على
/api/orders/*وإعادة توجيهها إلى خدمة Orders (المنفذ 8082) \n - التحقق من رمز JWT قبل تمرير الطلب \n
- تخزين طلبات GET مؤقتًا لمدة 60 ثانية \n
- تجميع البيانات:
/api/profileسيجمع المعلومات من Users وOrders \n
الخطوة 1: تكوين المسارات
\n\nلننشئ ملف config.php، حيث نصف أي URL يؤدي إلى أين:
<?php\n// config.php\nreturn [\n 'routes' => [\n '/api/users' => [\n 'target' => 'http://127.0.0.1:8081',\n 'auth' => true, // يتطلب JWT\n 'cache' => false // لا تخزين (بيانات شخصية)\n ],\n '/api/orders' => [\n 'target' => 'http://127.0.0.1:8082',\n 'auth' => true,\n 'cache' => 60 // تخزين لمدة 60 ثانية\n ],\n '/api/public' => [\n 'target' => 'http://127.0.0.1:8083',\n 'auth' => false,\n 'cache' => 120\n ],\n '/api/profile' => [ // نقطة نهاية مجمعة\n 'aggregate' => true,\n 'auth' => true,\n 'services' => [\n 'user' => 'http://127.0.0.1:8081/api/user',\n 'orders' => 'http://127.0.0.1:8082/api/order'