العودة إلى المدونة
Backendقراءة ٦ دقيقة

خارطة طريق الـBackend: من APIs وقواعد البيانات إلى Laravel و Node.js

المفاهيم التي تنجو من تغيير اللغة — HTTP و REST والنمذجة العلائقية والمصادقة والتخزين المؤقّت والطوابير والأمان — مع Laravel و Node.js كطريقين صالحين عبر الأرض نفسها.

محتويات المقال

الواجهة الخلفية هي المكان الذي يحافظ فيه التطبيق على وعوده. فالواجهة الأمامية يمكن إعادة بنائها في عطلة نهاية أسبوع؛ أما البيانات تحتها فلا يمكن ذلك عادةً. أفسدها أو سرّبها أو افقدها، ولن يهمّ أي قدر من صقل الواجهة. ولهذا يهيمن على عمل الواجهة الخلفية اهتمامات تبدو غير برّاقة — الصحّة والصلاحيات والتكامل والتعافي — ولهذا تنتقل هذه الاهتمامات بين اللغات بشكل شبه كامل.

‏HTTP ودورة حياة الطلب

كل شيء يبدأ من هنا. يرسل العميل طلباً بطريقة ومسار وترويسات وغالباً جسم. ثم يوجّهه تطبيقك، ويوثّقه، ويتحقّق منه، وينفّذ العمل، ويعيد استجابة برمز حالة وجسم. وكل إطار عمل يكسو هذا بشكل مختلف، وتحته دائماً التسلسل نفسه.

رموز الحالة جزء من عقد واجهتك البرمجية لا زخرفة. وإعادة 200 مع رسالة خطأ داخل الجسم عادة شائعة لدى المبتدئين تُعطِب كل عميل يثق بالبروتوكول. استخدم 200 للنجاح، و 201 للإنشاء، و 400 للطلب المشوّه، و 401 حين تكون الهوية غائبة أو غير صالحة، و 403 حين تكون الهوية سليمة والصلاحية لا، و 404 حين لا يوجد المورد، و 422 لإخفاقات التحقّق، و 500 حين تنكسر شيفرتك.

و REST مجموعة أعراف لتشكيل تلك التبادلات حول الموارد. عناوين متوقّعة، وطرق صحيحة، وأشكال استجابة متّسقة، وتصفّح معقول، وإصدارات تتيح لك التغيير دون كسر العملاء الحاليين. والاتّساق أهم من النقاء: فواجهة برمجية تتصرّف فيها كل نقطة نهاية بالطريقة نفسها التي تصرّفت بها السابقة سهلة الاستخدام حتى لو تحفّظ عليها متشدّد.

قواعد البيانات ونمذجة البيانات

هذه أعلى المهارات أثراً في عمل الواجهة الخلفية، وهي الأكثر تخطّياً لصالح تعلّم ORM. فالمخطّط الجيد يجعل المزايا سهلة لسنوات؛ والسيّئ يجعل كل ميزة مفاوضة مع قراراتك الماضية.

  • الجداول والأعمدة واختيار الأنواع المناسبة — بما في ذلك ألّا تخزّن المال أبداً كعدد عشري عائم.
  • المفاتيح الأساسية والخارجية، وترك قاعدة البيانات تفرض العلاقات بدلاً من الأمل في أن تفعل الشيفرة ذلك.
  • علاقات واحد إلى متعدّد ومتعدّد إلى متعدّد، وجداول الربط التي تتطلّبها الثانية.
  • التطبيع، ومعرفة متى يكون إلغاء التطبيع المتعمّد هو المقايضة الصحيحة.
  • الفهارس — ما الذي تسرّعه، وما تكلفتها عند الكتابة، وكيف تعرف ما إذا كان أحدها مستخدماً.
  • المعاملات — تجميع العمليات بحيث تنجح كلها أو تفشل كلها معاً.

وتستحق مشكلة استعلامات N+1 التسمية لأنها أشيع علّة أداء في تطبيقات الويب. فأنت تحمّل قائمة طلبات، ثم تمرّ عليها سائلاً عن عميل كل طلب — فيتحوّل استعلام واحد إلى مئة وواحد. ولكل ORM ناضج طريقة لتحميل تلك العلاقات مسبقاً، ومعرفة اللجوء إليها هي الفرق بين صفحة تُحمَّل فوراً وأخرى تنتهي مهلتها.

وقواعد بيانات NoSQL مثل MongoDB تناسب أشكالاً معيّنة من المشكلات — مستندات مرنة أو سريعة التطوّر، وأنماط توسّع محدّدة. وهي ليست ترقية تلقائية على SQL، واختيارها تهرّباً من تعلّم النمذجة العلائقية يميل إلى نقل الصعوبة لا إزالتها.

المصادقة والتفويض

تُستخدم هاتان الكلمتان بالتبادل وهما تعنيان أمرين مختلفين. المصادقة تُثبت من يكون الشخص. والتفويض يقرّر ما يُسمح لذلك الشخص بفعله. والخلط بينهما يُنتج الثغرة الكلاسيكية التي يستطيع فيها أي مستخدم مسجّل الوصول إلى سجلّات مستخدم آخر بتغيير معرّف في عنوان URL.

عملياً: جزّئ كلمات المرور بخوارزمية مصمّمة لهذا الغرض ولا تخترع مخطّطك الخاص أبداً، وافهم الجلسات مقابل الرموز ومقايضات كل منهما، وتحقّق من الصلاحيات على الخادم في كل طلب بغضّ النظر عمّا تعرضه الواجهة، وتأكّد من ملكية المورد لا من مجرّد أن أحدهم مسجّل الدخول. فإخفاء زرّ قرار في تجربة المستخدم، وليس ضابطاً أمنياً أبداً.

طريقان شائعان: Laravel و Node

لا أحدهما صحيح على إطلاقه. اختر بناءً على خلفيتك وما تبنيه، ثم لاحظ كم من التالي متطابق في الجانبين.

‏PHP و Laravel

ابدأ بـ PHP الحديثة نفسها — الأنواع، والبرمجة كائنية التوجّه، وفضاءات الأسماء، والاستثناءات، و Composer للاعتماديات. ثم Laravel، بهذا الترتيب تقريباً: التوجيه والمتحكّمات، والوسائط، والتحقّق من الطلبات، و Eloquent والعلاقات، وسياسات المصادقة والتفويض، وموارد API لتشكيل الاستجابات، ثم الطوابير والأحداث والمهام والإشعارات والتخزين المؤقّت والاختبار.

// A route, a policy check, validation, and a shaped response —
// the four things almost every endpoint does.

Route::post('/orders', function (StoreOrderRequest $request) {
    $this->authorize('create', Order::class);

    $order = Order::create($request->validated());

    return new OrderResource($order);
})->middleware('auth:sanctum');
صياغة إطار العمل تختلف؛ أما هذه المسؤوليات الأربع فلا.

‏JavaScript و TypeScript و Node

إن كنت قادماً من الواجهة الأمامية، فهذا يُبقيك في لغة واحدة عبر المنصة. تعلّم نموذج Node — حلقة الأحداث، والإدخال والإخراج غير المتزامن، والتدفّقات — ثم اختر إطار عمل. فـ Express بسيط ويعلّمك الآليات لأنك تجمّع كل شيء بنفسك. و NestJS ذو رأي وبنية، وأقرب فلسفةً إلى Laravel، ويميل إلى التوسّع بشكل أفضل عبر فريق.

ما بعد العمليات الأساسية

بمجرد أن تستطيع بناء نقاط نهاية تقرأ البيانات وتكتبها بشكل موثوق، تكون الطبقة التالية عن السلوك تحت الحمل والفشل ومرور الوقت.

  • التخزين المؤقّت — بـ Redis أو ما شابه. والجزء الصعب هو الإبطال لا التخزين.
  • الطوابير والمهام الخلفية — نقل العمل البطيء مثل الرسائل والتصدير ومعالجة الصور خارج الطلب.
  • المهام المجدولة — عمل متكرّر، مع الانتباه لما يحدث حين تتداخل دورة تشغيل أو تفشل.
  • تخزين الملفات — محلي مقابل تخزين كائنات، وعدم الوثوق أبداً بنوع الملف المرفوع أو اسمه.
  • تحديد معدّل الطلبات — حماية نقاط النهاية المكلفة من إساءة الاستخدام والحوادث على حدّ سواء.
  • السجلّات والمراقبة — معرفة أن شيئاً انكسر قبل أن يخبرك مستخدم.

أمان لا يمكنك تخطّيه

معظم الاختراقات ليست غريبة. بل تأتي من قائمة قصيرة من الأخطاء المفهومة جيداً: الوثوق بمدخلات المستخدم، وكشف بيانات أكثر ممّا قُصد، وإخفاق ضبط الوصول.

  • تحقّق من كل مدخل على الخادم. فالتحقّق في العميل تسهيل، وليس دفاعاً أبداً.
  • استخدم استعلامات ذات معاملات. فـ SQL المبني بدمج النصوص هو كيف يحدث الحقن.
  • أفلِت المخرجات واضبط الترويسات المناسبة لمنع البرمجة عبر المواقع.
  • احتفظ بالأسرار في متغيّرات البيئة، ولا تضعها في المستودع أبداً.
  • أعِد الحقول التي يحتاجها العميل فقط — والمُسلسِلات موجودة لهذا جزئياً.
  • أبقِ الاعتماديات محدّثة، واعرف ما الذي يسحبه تطبيقك فعلاً.

الإطلاق والتشغيل

الشيفرة التي تعمل على جهازك فقط ليست منتهية. فالطبقة التشغيلية — الاختبار والحاويات و CI/CD وخادم Linux وخادم ويب أمام تطبيقك والنسخ الاحتياطية — هي ما يحوّل شيفرة تعمل إلى خدمة تعمل. لست بحاجة إلى كل ذلك في اليوم الأول، لكن تجنّبه إلى ما لا نهاية يضع سقفاً صلباً على ما يمكنك تحمّل مسؤوليته.

وأنماط المعمارية — SOLID والمعمارية النظيفة وطبقات الخدمات والمستودعات — تأتي في آخر هذه القائمة عن قصد. فهي إجابات على مشكلات الحجم والتغيير. وتطبيقها على تطبيق صغير قبل وجود تلك المشكلات يضيف التفافاً وتكلفة دون أن يشتري شيئاً. ابنِ شيئاً حقيقياً أولاً؛ وستصبح الأنماط منطقية حين تشعر بالألم الذي تعالجه.

  • Backend
  • Laravel
  • Node.js
  • Databases
  • APIs
  • Security
  • Roadmap

أحمد العايدي

مطوّر Full-Stack

أبني أنظمة إنتاجية متكاملة — أنظمة Laravel الخلفية، وواجهات React و Next.js، وتطبيقات الموبايل، ولوحات التحكم، وواجهات API. وأكتب عن القرارات وراء الأنظمة التي تصل إلى مستخدمين حقيقيين.

اقرأ أيضاً

واتساب