چرخه حیات درخواست در لاراول به زبان ساده

چرخه حیات درخواست در لاراول
چرخه حیات درخواست در لاراول

اعتماد به نفس بیشتری پیدا می‌کنیم اگر بدونیم ابزاری که استفاده می‌کنیم چطور کار می‌کنه، در واقع اگر نحوه عملکرد ابزاری رو متوجه بشیم احساس راحتی و اطمینان بیشتری نسبت بهش داریم.

شناخت چرخه حیات درخواست در لاراول قدم اول برای داشتن تجربه توسعه بهتر با این فریمورک هست، یعنی باید بدونیم چه پروسه‌ای اتفاق میفته از زمانی که درخواست ارسال میشه تا زمانی که پاسخ برگشت داده میشه.

خلاصه چرخه حیات درخواست‌های HTTP در لاراول: درخواست به نقطه ورود هدایت میشه، از لاراول نمونه‌سازی میشه، عناصر حیاتی راه اندازی میشن، service providerها ثبت و اجرا میشن و درخواست به سیستم روتینگ می‌رسه و از اونجا به یک route یا controller ارسال می‌شه و پاسخی تولید میشه که باید به نقطه ورود برگرده.

قدم اول: نقطه ورود

درخواست از سمت مرورگر به وب‌سرور(Apache / Nginx) می‌رسه و اون وب‌سرور براساس پیکربندی‌ خودش این درخواست رو به نقطه ورود تمامی درخواست‌ها در لاراول، یعنی فایل public/index.php هدایت می‌کنه و بر این اساس میشه گفت که این فایل نقطه شروع کننده بارگذاری بقیه فریمورک هست.

هدایت درخواست ورودی به نقطه شروع در لاراول
هدایت درخواست ورودی به نقطه شروع در لاراول

همینطور تو این قدم autoloader که توسط Composer ساخته شده داخلindex.php لود می‌شه:

فراخوانی autoloader در لاراول
فراخوانی autoloader در لاراول

و بعدش یک نمونه از اپلیکیشن لاراول از فایل bootstrap/app.php بازیابی می‌شه:

بازیابی نمونه‌ای از  اپلیکیشن لاراول
بازیابی نمونه‌ای از اپلیکیشن لاراول

قدم دوم: هسته‌ها

درخواست ورودی براساس جنسش به HTTP Kernel یا Console Kernel ارسال میشه، این هسته‌ها در واقع نقش نقطه مرکزی رو دارند که درخواست‌ها براساس جنسشون از اونها عبور می‌کنند.

تشخیص هسته اصلی براساس جنس درخواست در لاراول
تشخیص هسته اصلی براساس جنس درخواست در لاراول
  • اگر درخواست ورودی از جنس HTTP باشه، برای مثال از سمت مرورگر اومده باشه هسته اصلی app/Http/Kernel.php در نظر گرفته میشه.
  • اگر درخواست ورودی از جنس Console باشه، برای مثال از سمت ترمینال اومده باشه هسته اصلی app/Console/Kernel.php در نظر گرفته میشه.

درخواست‌ها در هسته به متد ()handle وارد میشن که به طور خلاصه کل کار این متد دریافت درخواست و برگشت دادن پاسخ هست.

ورود درخواست به متد ()handle و دریافت پاسخ از آن
ورود درخواست به متد ()handle و دریافت پاسخ از آن

به طور خلاصه میتونیم هسته‌های لاراول رو تو یه جمله خلاصه کنیم:

هسته‌ها را به عنوان یک جعبه سیاه بزرگ ببینید که کل برنامه شما را نشان می دهد.

هسته‌ها از کلاس والد دیگه‌ای ارث‌بری می‌کنند که داخل اون کلاس‌ها آرایه‌ای با نام bootstrappers$ وجود داره که کلاس‌های مختلفی به منظور راه‌اندازی در آن تعریف شدند. این کلاس‌ها قبل از اجرا شدن درخواست ورودی اجرا میشن چون باید ویژگی‌های حیاتی فریمورک مثل تشخیص محیط برنامه را راه‌اندازی کنند. در واقع پیکربندی هرچیزی که باید تا قبل از هندل شدن درخواست اصلی انجام بشه مثل پیکربندی سیستم مدیریت خطا، تنظیمات، لاگینگ و لود کردن facadeها و service providerها در این قسمت انجام میشه. همچنین لیستی از middlewareها فقط داخل هسته‌ی HTTP تعریف شدند که درخواست ورودی باید قبل از هندل شدن توسط برنامه از اونها عبور کنه.

قدم سوم: Service Providers

لود کردن service providerها یکی از مهمترین عملیاتی بود که در پروسه‌ی راه‌اندازی اجزای اصلی در قدم دوم اتفاق می‌افتاد، service providerها به نوع خودشون مسئول لود کردن قسمت‌ها مختلف فریمورک لاراول مثل روتینگ و ایونت‌ هستند.

تمامی service providerها در آرایه‌ای با نام providers$ داخل فایل config/app.php قرار دارند که با serviceProviderهای موجود در هسته ادغام می‌شوند و در این قدم آرایه مربوطه توسط لاراول پیمایش میشه و به ازای تمامی providerهای موجود از اونها نمونه سازی می‌کنه. بعد از نمونه‌سازی اولیه از service providerها اول متد register روی هر کدوم از اونها صدا زده می‌شه که باعث ثبت شدنشون میشه و بعدش متد bootروی هر کدوم از اونها صدا زده میشه.

اساسا ویژگی‌های اصلی لاراول مثل روتینگ در قالب service providerها پیکربندی و ارائه میشن و با توجه به همین موضوع میشه گفت که عملیات مربوط به اجرای service providerها که از قدم دوم شروع میشه و تا قدم سوم ادامه پیدا می‌کنه جزو مهمترین عملیات در چرخه حیات یک درخواست هست.

قدم چهارم: مسیریابی

یکی از مهم‌ترین providerها RouteServiceProvider هست که وقتی متد boot این provider اجرا میشه سیستم روتینگ هم راه اندازی میشه. در این مرحله درخواست ورودی به سیستم روتینگ میرسه و فایل‌های مربوط به مسیریابی مثل api.php و web.php که در پوشه routesهستند لود میشن و اگر درخواست از جنس HTTP باشه از middlewareهای مورد نیاز عبور میکنه و به یک route یا controller میرسه.

در مسیر راه درخواست‌هایی که از جنس Console هستند middleware تعریف نشده، پس اونها مستقیما به command یا کلاس مورد نظر خودشون برای اجرا شدن میرسن.

قدم پنجم: اتمام ماجرا

اگر درخواست ما از جنس HTTP باشه سیستم روتینگ در نهایت درخواست‌ها رو به controller ارسال میکنه ولی می‌تونه با حذف controller خودش مستقیما پاسخ مناسب رو برگردونه، controller به محض دریافت درخواست می‌تونه اقداماتی مثل دریافت اطلاعات از دیتابیس یا اعتبار سنجی فرم انجام بده و در نهایت این اطلاعات رو برای پردازش به viewمناسب ارسال کنه تا در اونجا یک پاسخ مناسب برای نمایش در مرورگر کاربر ایجاد بشه.

پاسخ برگشت داده شده این پتانسیل رو داره که از middleware ها عبور کنه که امکان ایجاد تغییرات در پاسخ رو فراهم می‌کنند. در ادامه، این پاسخ به متد()handle در kernel می‌رسه و از اونجا برگشت داده میشه و به متد ()send در public/index.phpبرای نمایش در مرورگر وارد میشه.

البته بازهم در نظر داشته باشید که اگر درخواست ما از جنس Console باشه در مسیر خودش با middleware روبرو نمیشه، پس در مسیر بازگشت هم همینطوری هست و پاسخ مورد نظر با middlewareها برخورد نداره و مستقیما به متد ()handle در kernel می‌رسه و از اونجا برگشت داده میشه و به متد ()sendکه در public/index.php برای نمایش در ترمینال وارد میشه.


تونستیم کنار هم دید کلی از نحوه کار لاراول رو بدست بیاریم و مطمئنا از این به بعد همه چیز در لاراول کمتر عجیب و جادویی به نظر می‌رسه و می‌تونیم با اطمینان و تسلط بیشتر به توسعه ایده‌ها بپردازیم.