العودة للمقالات
2026-04-21 Abdelrhman Yasser

دورة حياة الطلب في Laravel: من نقطة الدخول إلى الاستجابة

دورة حياة الطلب في Laravel: من نقطة الدخول إلى الاستجابة

مدة القراءة: 25 دقيقة

مقدمة

كل طلب HTTP يصل إلى تطبيق Laravel يتبع مساراً محدداً بدقة من لحظة دخوله public/index.php حتى يتم إرسال الرد إلى العميل. فهم هذه الرحلة ليس اختيارياً — بل هو أهم مفهوم لتصحيح الأخطاء وتحسين الأداء وبناء التطبيقات المعقدة.

المطورون المبتدئون غالباً ما يتعاملون مع Laravel كصندوق أسود. يكتبون المسارات والتحكمات والنماذج دون فهم ما يحدث بينهم. هذا المقال يفتح ذلك الصندوق الأسود ويفحص كل طبقة يمر بها الطلب.

المشكلة

عندما يضرب المتصفح /users، ماذا يحدث بالضبط؟ الإجابة الواضحة هي "التحكم يعمل ويرجع رداً". لكن بين المتصفح وذلك التحكم، عشرات الكلاسات تنفذ بترتيب دقيق. إذا فشل أي منها، يفشل الطلب بأكمله.

بدون فهم دورة الحياة، أنت تتصيد الأخطاء بشكل عشوائي. هذا مؤلم بشكل خاص عندما:

  • middleware يعمل ولكنك لا تعرف الترتيب
  • boot() في مزود الخدمة يرمي استثناء
  • تحتاج لإضافة منطق يعمل قبل أو بعد كل طلب

بنية Laravel: الأساس

MVC في Laravel

┌──────────────┐     ┌──────────────┐     ┌──────────────┐
│    Route     │────▶│  Controller  │────▶│    Model     │
│  (web.php)   │     │  (Business)  │     │   (Data)     │
└──────────────┘     └──────────────┘     └──────────────┘
                            │
                            ▼
                     ┌──────────────┐
                     │    View      │
                     │  (Response)  │
                     └──────────────┘

حاوية IoC

في قلب Laravel توجد حاوية IoC (عكس التحكم)، وتسمى أيضاً حاوية الخدمة. تقريباً كل كلاس يتم حله خلال دورة حياة الطلب يمر عبر هذه الحاوية.

نقطة الدخول: public/index.php

<?php

define('LARAVEL_START', microtime(true));

require __DIR__.'/../vendor/autoload.php';

$app = require_once __DIR__.'/../bootstrap/app.php';

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

$response = $kernel->handle(
    Request::capture()
)->send();

$kernel->terminate($request, $response);

دورة حياة handle()

مرحلة التمهيد (Bootstrap)

يقوم kernel بتشغيل أدوات التمهيد بالترتيب:

  1. تحميل متغيرات البيئة
  2. تحميل الإعدادات
  3. معالجة الاستثناءات
  4. تسجيل الواجهات (Facades)
  5. تسجيل مزودي الخدمة
  6. تشغيل مزودي الخدمة

مزودات الخدمة: register() vs boot()

register() — فقط قم بربط الحاويات هنا. لا تستخدم خدمات تم حلها من الحاوية لأن المزودات الأخرى قد لا تكون سُجلت بعد.

boot() — كل المزودات مسجلة في هذه المرحلة. يمكنك استخدام أي خدمة من الحاوية.

أنابيب Middleware

يدخل الطلب إلى pipeline، يمر عبر كل middleware، يصل إلى التحكم، ثم يعود الرد عبر نفس pipeline بترتيب عكسي.

تحسينات الأداء

المرحلةالتكلفةالتحسين
تحميل الإعداداتعاليةphp artisan config:cache
تسجيل المزوداتمتوسطةاستخدام deferred providers
المساراتعاليةphp artisan route:cache

أخطاء شائعة

استخدام الخدمات في register():

// ❌ خطأ — المزودات الأخرى لم تُسجل بعد
public function register(): void
{
    $logger = $this->app->make(Logger::class);
}

// ✅ صحيح — فقط الربط في register()
public function register(): void
{
    $this->app->singleton(Logger::class);
}

الخلاصة

دورة حياة الطلب في Laravel ليست سحراً — إنها pipeline مصممة جيداً من bootstrappers ومزودات خدمة و middleware وتوجيه. كل طبقة قابلة للتوسيع والاختبار.

فهم هذه الدورة يحول طريقة تعاملك مع التصحيح والتحسين:

  1. index.php — الدخول، التحميل التلقائي، حل kernel
  2. Bootstrappers — البيئة، الإعدادات، الاستثناءات، الواجهات، المزودات
  3. مزودات الخدمة — ربط، تشغيل
  4. Middleware — معالجة قبلية، pipeline، معالجة بعدية
  5. التوجيه — مطابقة، ربط المعاملات، توزيع
  6. التحكم — منطق العمل، الرد
  7. الإنهاء — تنظيف، تسجيل

مقالات ذات صلة

# Laravel# PHP# Architecture# Backend# MVC
WhatsApp
تواصل عبر واتساب