دورة حياة الطلب في 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 بتشغيل أدوات التمهيد بالترتيب:
- تحميل متغيرات البيئة
- تحميل الإعدادات
- معالجة الاستثناءات
- تسجيل الواجهات (Facades)
- تسجيل مزودي الخدمة
- تشغيل مزودي الخدمة
مزودات الخدمة: 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 وتوجيه. كل طبقة قابلة للتوسيع والاختبار.
فهم هذه الدورة يحول طريقة تعاملك مع التصحيح والتحسين:
- index.php — الدخول، التحميل التلقائي، حل kernel
- Bootstrappers — البيئة، الإعدادات، الاستثناءات، الواجهات، المزودات
- مزودات الخدمة — ربط، تشغيل
- Middleware — معالجة قبلية، pipeline، معالجة بعدية
- التوجيه — مطابقة، ربط المعاملات، توزيع
- التحكم — منطق العمل، الرد
- الإنهاء — تنظيف، تسجيل