مفهوم معماری به طور کلی به مجموعه طرحها، الگوها، مفاهیم و اصولی اطلاق میشود که برای طراحی، ساخت و اجرای یک سیستم استفاده میشود. در حوزه نرمافزار، معماری به عنوان یک مفهوم اساسی و حیاتی برای ساخت و توسعه نرمافزارها مطرح است. به همین دلیل، معماری نرمافزار به عنوان مفهومی کلیدی در توسعه نرمافزار شناخته میشود.
این مقاله در مستندات فریمورک لاراول نسخه 10، به چرخه عمر یک درخواست HTTP در لاراول میپردازد. در لاراول، هر درخواست HTTP از مراحلی مانند شروع، مسیریابی، اجرای کنترلر، ارسال پاسخ و … عبور میکند. این مقاله از لاراول کارا نحوه عملکرد هریک از این مراحل را بررسی میکند و به شما کمک میکند تا درک بهتری از چگونگی کارکرد لاراول پیدا کنید.
Request Lifecycle به مجموعهای از مراحل و فرآیندهایی گفته میشود که یک درخواست HTTP در سیستم پردازش میشود. با دنبال کردن این چرخه عمر درخواست، میتوانید فرآیند اجرای درخواست را در سطح سیستم به خوبی درک کنید و مشکلات احتمالی را شناسایی و رفع کنید. در محیط وب، Request Lifecycle معمولاً شامل مراحلی مانند دریافت درخواست، مسیریابی، اجرای کنترلر، دسترسی به دادهها، تجزیه و تحلیل و اعمال قوانین امنیتی، تولید پاسخ و ارسال آن به مرورگر میشود.
# مقدمه (Introduction)
وقتی از هر ابزاری در “دنیای واقعی” استفاده میکنید، اگر بفهمید چگونه آن ابزار کار میکند، احساس اطمینان بیشتری خواهید داشت. توسعه برنامه نیز همینطور است. با فهمیدن نحوه عملکرد ابزارهای توسعه، شما احساس راحتی و اطمینان بیشتری در استفاده از آنها خواهید داشت.
هدف این سند، ارائه یک دید کلی و خوب از نحوه کار فریمورک لاراول است. با شناخت بهتر فریمورک به طور کلی، همه چیز به نظر کمتر جادویی خواهد آمد و شما در ساخت برنامههای خود اطمینان بیشتری خواهید داشت. اگر از ابتدا تمامی اصطلاحات را به طور کامل متوجه نشدید، ناامید نشوید! فقط تلاش کنید تا درک پایهای از آنچه در حال اتفاق افتادن است، پیدا کنید و با بررسی بخشهای دیگر مستندات، دانش خود را تدریجی گسترش دهید.
# بررسی کلی چرخه عمر درخواست (Lifecycle Overview)
# مراحل اولیه (First Steps)
نقطه ورود برای همه درخواستهای یک برنامه Laravel، فایل public/index.php میباشد. تمام درخواستها توسط تنظیمات وب سرور شما (Apache / Nginx) به این فایل هدایت میشوند. فایل index.php حاوی کد زیادی نیست، بلکه نقطه شروع برای بارگذاری بقیه بخشهای فریمورک است.
فایل index.php تعریف خودکار autoloader تولید شده توسط Composer را بارگذاری میکند و سپس یک نمونه از برنامه Laravel را از bootstrap/app.php بازیابی میکند. اولین کاری که لاراول انجام میدهد، ایجاد یک نمونه از container سرویس برنامه است.
# HTTP / Console Kernels
سپس، درخواست ورودی به یکی از هستههای HTTP یا کنسول ارسال میشود، بسته به نوع درخواستی که وارد برنامه میشود. این دو هسته به عنوان مکان مرکزی برای عبور تمام درخواستها عمل میکنند. برای حال، فقط روی هسته HTTP تمرکز کنید که در مسیر app/Http/Kernel.php قرار دارد.
هسته HTTP از کلاس Illuminate\Foundation\Http\Kernel به عنوان پایه ارثبری کرده است، که یک آرایه از bootstrapper ها را تعریف میکند که قبل از اجرای درخواست اجرا خواهند شد. این bootstrapperها، پیکربندی کنترل خطا، پیکربندی logging، تشخیص محیط برنامه و انجام وظایف دیگری را که باید قبل از اجرای درخواست انجام شوند، انجام میدهند. به طور معمول، این کلاسها، پیکربندی داخلی Laravel را که نیازی به نگرانی شما ندارید، انجام میدهند.
هسته HTTP، همچنین فهرستی از middleware HTTP را تعریف میکند که تمام درخواستها باید قبل از اینکه توسط برنامه انجام شوند، از آنها عبور کنند. این middleware، خواندن و نوشتن جلسه HTTP، تشخیص اینکه برنامه در حالت نگهداری است یا خیر، تأیید توکن CSRF و دیگر وظایف را انجام میدهند. به زودی در مورد این middleware ها بیشتر صحبت خواهیم کرد.
امضای متد handle هسته HTTP بسیار ساده است: یک درخواست دریافت میکند و به عنوان پاسخ یک پاسخ HTTP را برمیگرداند. تصور کنید هسته به عنوان یک جعبه سیاه بزرگ است که برنامه شما را نمایش میدهد. درخواستهای HTTP را به آن بدهید و پاسخهای HTTP را دریافت کنید.
Bootstrapper چیست؟
Bootstrapper به معنی کلاسهایی است که مسئول اجرای عملیاتهایی هستند که قبل از اجرای درخواست باید انجام شوند. این عملیات شامل پیکربندی کنترل خطا، پیکربندی logging، تشخیص محیط برنامه و انجام وظایف دیگری است. در لاراول، bootstrapping به معنی اجرای عملیاتهایی قبل از شروع برنامه است. به عبارت دیگر، bootstrapping یک فرآیند ضروری است که باید انجام شود تا برنامه به درستی کار کند. در اینجا، bootstrapperها مسئول اجرای این فرآیند هستند.
# ارائه دهندههای سرویس (Service Providers)
یکی از مهمترین عملیات bootstrapping هسته، بارگذاری service provider ها برای برنامه شما است. Service provider ها مسئول bootstrapping تمامی اجزای مختلف framework مانند پایگاه داده، صف، اعتبارسنجی و اجزای مسیریابی هستند. تمامی service provider های برنامه در آرایه providers فایل پیکربندی config/app.php تنظیم شدهاند.
لاراول از لیستی از این service providerها عبور میکند و هر یک از آنها را نمونهسازی میکند. پس از نمونهسازی provider ها، متد register در تمام provider ها فراخوانی خواهد شد. و بعد، پس از ثبت نام تمامی providerها، متد boot بر روی هر provider فراخوانی خواهد شد. به این منظور است که service providerها ممکن است برای اجرای متد boot، به هر binding موجود در container وابسته باشند.
به طور کلی، تقریباً هر ویژگی اصلی ارائه شده توسط لاراول توسط یک service provider bootstrapped و پیکربندی میشود. از آنجا که این providerها تقریباً تمام ویژگیهای ارائه شده توسط فریمورک را bootstrapped و پیکربندی میکنند، service providerها مهمترین جنبه فرآیند bootstrapping کل لاراول هستند.
# مسیریابی (Routing)
یکی از مهمترین service provider های برنامه شما، App\Providers\RouteServiceProvider است. این service provider فایلهای مسیریابی موجود در دایرکتوری مسیرهای برنامه شما را بارگذاری میکند. برای مشاهده کد RouteServiceProviderرا بررسی کنید تا ببنید چگونه کار می کند.
پس از bootstrapping برنامه و ثبت نام تمامی service providerها، درخواست به مسیریاب برای ارسال داده خواهد شد. مسیریاب، درخواست را به یک مسیر یا کنترلر ارسال میکند، همچنین هر middleware خاص مسیر را اجرا میکند.
Middleware مکانیزمی مناسب برای فیلترینگ یا بررسی درخواستهای HTTP ورودی به برنامه شما فراهم میکنند. به عنوان مثال، لاراول یک middleware شامل تأیید اطلاعات کاربری دارد. اگر کاربر تأیید نشده باشد، middleware کاربر را به صفحه ورود به سیستم هدایت میکند. با این حال، اگر کاربر تأیید شده باشد، middleware به درخواست اجازه میدهد تا به برنامه ادامه دهد. برخی middleware به تمامی مسیرهای برنامه اختصاص داده شدهاند، مانند آنهایی که در $middleware در کرنل HTTP شما تعریف شدهاند، در حالی که دیگری فقط به مسیرهای خاص یا گروههای مسیر اختصاص داده شدهاند. شما میتوانید با خواندن مستندات کامل middleware، بیشتر در مورد آنها بیاموزید.
اگر درخواست از تمام middleware های اختصاص داده شده به مسیر منطبق عبور کند، متد مسیر یا کنترلر اجرا خواهد شد و پاسخ از طریق زنجیره middleware مسیر برگشت داده خواهد شد.
# به پایان رساندن (Finishing Up)
بعد از اینکه متد مسیر یا کنترلر پاسخی را برمیگرداند، پاسخ به مسیرهای middleware باز میگردد تا برنامه فرصتی برای اصلاح یا بررسی پاسخ خروجی داشته باشد.
در پایان، پس از اینکه پاسخ از طریق مسیرهای middleware بازگشت داده شد، متد handle کرنل HTTP شیء پاسخ را برمیگرداند و سپس فایل index.php متد send را بر روی پاسخ برگشت داده شده فراخوانی میکند. متد send محتوای پاسخ را به مرورگر وب کاربر ارسال میکند. به این ترتیب، ما به پایان مراحل درخواست لاراول رسیدیم.
# تمرکز بر ارائه دهندههای سرویس (Focus On Service Providers)
Service Provider ها در واقع کلید راهاندازی یک برنامه لارولی هستند. نمونه برنامه ایجاد میشود، Service Providerها ثبت میشوند و درخواست به برنامه راهاندازی شده داده میشود. این واقعاً به این سادگی است!
آشنایی قوی با نحوه ساخت و راهاندازی یک برنامه لاراول از طریق Service Providerها بسیار ارزشمند است. Service Providerهای پیشفرض برنامه شما در دایرکتوری app/Providers ذخیره میشوند.
Service ProviderAppServiceProvider به طور پیشفرض خالی است. این Provider مکان مناسبی برای افزودن راهاندازی و اتصالات مخزن سرویس برنامه شماست. برای برنامههای بزرگ، شما میتوانید چندین Service Provider ایجاد کنید، هر کدام با راهاندازی دقیقتر برای سرویسهای خاصی که برنامه شما استفاده میکند.