همیشه وقتی درک کنیم یه چیزی چطوری کار میکنه، حس بهتری به اون ابزار داریم و میتونیم راحت تر با اون کار کنیم. این حس در توسعه نرم افزار هم وجود داره، پس ما باید بدونیم ابزاری که باهاش کار میکنیم داره چجوری کار میکنه !!
وقتی شما میدونید یه ابزار داره کار خودشو به چه صورتی انجام میده خیلی راحت تر میتونید با اون کار کنید و از اون استفاده کنید.
در هر قسمتی از این مقاله اگه احساس کردید قسمتی رو متوجه نمیشید میتونید کامنت کنید تا براتون شفاف تر توضیح بدم، البته یه قسمت هایی هم وجود داره که با توجه به سطح تجربه و دانش شما، ممکنه درکش براتون سخت تر باشه، البته نگران نباشید میتونید برید و درباره اون بخش مقالاتی بخونید و سطح مهارت خودتون در اون بخش رو افزایش بدید تا درک اون بخش براتون ساده تر بشه.
نقطه شروع یه برنامه لاراول از فایل index.php هست، این فایل در پوشه public به صورت پیشفرض وجود داره و همه درخواست هایی که به سرور ارسال میشه وارد این فایل میشن و این فایل فقط وظیفه بارگزاری چهارچوب لاراول رو داره و کد خیلی زیادی هم داخلش نیست.
در اولین قدم autoloader که توسط composer ساخته شده بارگیری میشه و سپس درخواست وارد فایل bootstrap/app.php میشه و در این فایل لاراول اپلیکیشن رو بارگیری میکنه.
در دومین قدم تمامی درخواست ها وارد فایل کرنل HTTP یا هسته اصلی پردازش درخواست های HTTP میشن. این هسته درواقع فایل kernel.php هست که در پوشه app در زیر پوشه http وجود داره.
این فایل در واقع یک کلاس هست که از Illuminate\Foundation\Http\Kernel گرفته شده یا همون extend شده. در این کلاس ارایه ای از bootstrappers هست که قبل از اجرا ساخته میشه. که اون ها شامل تنظیم ارور هندلینگ، لاگ، بارگیری environment های لاراول و چیز هایی که قبل از پردازش درخواست، نیاز هست که بارگیری بشن.
به طور معمول، این کلاس ها پیکربندی داخلی لاراول را انجام می دهند که نیازی به نگرانی در مورد اون ها ندارید.
بعد از این مرحله در کرنل لیستی از middleware وجود داره که قبل از رسیدن به برنامه، درخواست باید از داخل این middleware ها رد بشه، کار این middleware ها خواندن و نوشتن session یا بررسی حالت تعمیر و نگهداری، تایید توکن CSRF و موارد دیگه هست.
یکی از مهمترین وظایف در مراحل bootstrappers بارگزاری service providers هست.
این سرویس ها وظیفه ثبت اجزای مختلف لاراول هستند. اجزای مختلفی مانند دیتابیس ها، صف ها، ولیدیشن ها، روتر ها و غیره. به این نکته دقت کنید که همه این سرویس پرووایدر ها داخل ارایه ای در config/app.php وجود دارند که میتونید برید داخل این فایل و اونهارو مشاهده کنید.
در واقع لاراول از این ارایه اونهارو بارگزاری میکنه و سپس متد register را در تمامی اون ها فراخوانی میکنه، بعد از register شدن همه سرویس پروایدر ها، به نوبت متد boot اون ها فراخوانی میشن. پس لازمه بدونید که اگر شما نیاز دارید که داخل یک سرویس پروایدر از ابزاری که مربوط به سرویس پروایدر دیگری هست استفاده کنید باید کد شما داخل boot سرویس پروایدر باشه تا قبل از فراخوانی متد شما اون ابزار register شده باشه و در دسترس باشه.
اساسا تمامی خدمات اصلی در لاراول، bootstrapped شده اند و همه اون ها توسط سرویس پروایدر ها پیکربندی میشن. از اون جایی که سرویس پروایدر ها وظیفه bootstrap و پیکربندی تمامی خدمات اصلی لاراول رو به عهده دارن، پس میتونید بگیم service providers ها مهم ترین جنبه تمام bootstrap process فریم ورک لاراول هستند.
یکی از مهمترین سرویس پروایدر ها در لاراول RouteServiceProvider هست که وظیفه بارگزاری فایل های روت در نرم افزار رو داره. کار این سرویس پروایدر در واقع همون مسیر یابی و اتصال یک کاربر به یه کنترلر و دریافت نتیجه هست.
در روتر امکان استفاده از Middleware هم وجود داره و شما میتونید به هر مسیری یک Middleware خاص اضافه کنید. در واقع Middleware ها یک مکانیزم خوب و عالی برای فیلتر و بررسی درخواست های HTTP هستند، برای مثال شما میتونید با استفاده از یک Middleware بررسی کنید که آیا کاربر شما وارد حساب کاربری خود شده است یا خیر؟؟ اگه وارد نشده بود Middleware کاربر رو به صفحه ورود هدایت خواهد کرد.
البته برخی از Middleware ها به تمامی مسیر ها اختصاصی داده شده اند که در قبل گفته شد و اونها در Kernel بررسی خواهند شد.
تمامی درخواست ها پس از رد شدن از زنجیره ای از Middleware ها وارد کنترلر میشوند و در انجا پردازش انجام شده و نتیجه توسط زنجیره دیگری از middleware بازگشت داده خواهد شد و در این بخش برنامه فرصتی برای اصلاح و بررسی خروجی خود دارد.
بعد از این بخش پاسخ به کرنل HTTP خواهد رسید و این کلاس پاسخ را به index.php میرساند و کاربر میتواند خروجی درخواست خود را در مرورگر ببیند.
امیدوارم این مبحث رو تونسته باشم به خوبی و سادگی براتون توضیح داده باشم و کمک کوچیکی به شما برای درک بهتر Request Lifecycle لاراول کرده باشم.