برنامهنویس بَکاِند، عاشق موسیقی
چرا لاراول یک فریمورک مبتنی بر MVC نیست ، و باید MVC را فراموش کنید !
در نیمه دوم سال 2017 قرار داریم ، و بسیاری اصرار بر پیادهسازی الگوی MVC در فریمورکهایی همچون لاراول یا سیمفونی دارند ، درحالیکه اینها فریمورکهای مبتنی بر MVC نیستند (منظور MVC خالص است) . اما پیش از ورود به این مساله اجازه دهید که یکبار برای همیشه ببینیم MVC چیست.
آشنایی با MVC :
رینسکاگ (Trygve Reenskaug) مدل MVC را در اواخر دهه هفتاد میلادی به منظور توسعه بیشتر Smalltakl-80 (یک زبان برنامه نویسی مبتنی بر شی گرایی) اختراع کرد.
ایده و هدف این الگو ، استفاده در کامپوننتهای کوچک بود.
یک CheckBox را تصور کنید ؛
این CheckBox دارای :
- یک مدل (model) : که مسئول ذخیره اطلاعات است ، در این مثال CheckBox یا تیک دارد یا ندارد.
- یک ویو (view) : که نمایش گرافیکی CheckBox را بر عهده دارد. این ویو به اطلاعات مدل برای اینکه بداند چطور نمایش داده شود نیاز دارد. همینطور کاربر برنامه را از طریق ویو میتواند ببیند.
- یک کنترلر (controller) : که عمل کاربر را مورد بررسی قرار میدهد (مثلا کاربر تیک CheckBox را میزند) و model را آپدیت میکند.
زمانی که تغییرات در مدل رخ داد ، ویو آپدیت میشود.
در اینجا میتوانید رابطه بین این سه لایه را ببینید. اما مورد مهمتر این است که کاربر چطور اطلاعات را از ویو میگیرد و اعمال وی بوسیله کنترلر مورد پردازش قرار میگیرد.
به همین دلیل سالها پیش درک MVC برای من سخت بود ، زیرا : MVC برای نمایش کامپوننتهای کوچک طراحی شده بود ، نه برای نرم افزارهای مدرن تحت وب.
حیات MVC در عصر حاضر
امروزه برای توسعه موفقیتآمیز نرمافزارهای تحت وب ، به لایههای بیشتری نیاز داریم. به عنوان نمونه در MVC :
- روشی برای فهماندن روتها (routes) که وظیفه بررسی URL ها و اختصاص آن به متدها و فانکشنها را دارند ، را نداریم.
- راهی برای نمایش برنامههای میانی (middleware) که وظیفه محدوده کردن قسمتی مشخص از برنامه بر اساس وضعیت کاربر را دارند ، را نداریم.
- یک برنامه مدرن برای نمایش اطلاعات به چیزی بیش از مدل (model) نیاز دارد.
فکر میکنم به همین دلیل در ویکیپدیا ، هرچقدر که بخشهای مختلف وب تغییر میکرد ، مفاهیم MVC نیز تغییر کرده است ؛ که این تغییرات نیازهای نرمافزارهای مدرن را منعکس میکنند.
بطور مثال در ویکی پدیا گفته شده که یک مدل : مستقیما وظیفه اداره کردن اطلاعات ، منطق و قوانین (اصول) برنامه را بر عهده دارد. ویو : خروجی یا گرافیک مربوط به نمایش اطلاعات است. کنترلر : یک ورودی را میپذیرد و آن را به دستوراتی برای مدل و ویو تبدیل میکند.
این مفاهیم خیلی کلی (عمومی) هستند ، و ابزار لازم برای ساخت نرم افزارهای پیشفرته را به شما نمیدهند.
به عنوان مثال ، اکثریت معتقدند Model همان دیتابیس است ، اما 90 درصد نرم افزارها به "منطق" بیشتر از ذخیره اطلاعات نیاز دارند.
همانطور که Taylor Otwell (خالق Laravel) اشاره میکند :
هیچ راهی برای گنجاندن تمام جنبههای یک نرمافزار غولپیکر در آن سه لایه وجود ندارد.
به همین دلیل فریمورکهایی مثل لاراول یا سیمفونی MVC نیستند.
لاراول فریمورک مبتنی بر MVC نیست
در سوالی که مستقیما از Taylor Otwell در این مورد پرسیده شد :
گرچه در نسخه چهارم لاراول سه پوشه معروف controller ، models ، views مشاهده میشود ، ولی در نسخه پنجم این فریم ورک :
- فولدری با نام models دیگر وجود ندارد. به جای آن پوشه app قرار گرفته که میتوانید نرم افزار خود را در آن ساختار ببخشید.
- پوشه Controllers قسمت کوچکی از لایه Http است. همینطور در این لایه Middleware ها نیز وجود دارند. در پوشه Requests نیز روتها قابل دسترسی هستند.
- پوشه views نیز به بخشی از پوشه resources تبدیل شده است.
در پوشه app ، لایههایی چون Events ، Listeners ، Exceptions ، Jobs و ... نیز وجود دارد.
همانطور که میبینید ، با اینکه از Models ، Views و Controllers استفاده میشود ، اما ساختار لاراول MVC نیست ، زیرا به لایههای بیشتری برای سازماندهی تمام ابعاد خاص نرم افزار شما نیاز دارد.
ادامه به استفاده از MVC و مقاومت در برابر تغییر
ساختار MVC یک معماری (در نرمافزار) نیست
به ناگهان خود را در میان اقیانوسی مییابی، به شدت سردت شده و در حال غرق شدن هستی که تکه چوبی شناور در کنار خود میبینی. چه میکنی ؟ به آن میچسبی تا چند دقیقه بیشتر زنده بمانی.
اقیانوس همان "وب" است ، تکه چوب همان MVC ، و برنامه شما شناور است.
MVC به شما اجازه میدهد که نرم افزارتان را بسازید ، درست مانند آن تکه چوب که به شناور ماندن شما کمک میکرد. اما واقعا MVC برای چنین کاری (توسعه نرم افزارها و وب سایت های بزرگ) ساخته شده است ؟ نه ؟ پس چرا از آن استفاده میکنید ؟
امروزه به چه چیزی برای ساخت نرمافزارهای تحت وب نیاز است ؟
طبق گفته Taylor Otwell :
هیچگاه یک "معماری" شگفتانگیز برای توسعه وب ندیدهام. صرفا نرمافزارهایتان را به روشی معقول بسازید.
متاسفانه برای نرمافزارهای مختلف ، یک روش مشخص وجود ندارد. شما باید بر اساس نیازهای نرم افزارتان ، یعنی اینکه به ریپازیتوری نیاز دارد یا نه ، به middleware نیاز دارد یا نه ، به interface ها نیاز دارد یا نه و... روش مناسب را انتخاب کنید.
نویسنده : Kali Dass
ترجمه از مهراد
مطلبی دیگر از این انتشارات
۱۰ ویژگی مخفی لاراول که تا به امروز نمی دانستید
مطلبی دیگر از این انتشارات
مدیریت تاریخ و زمان در لاراول توسط کربن
مطلبی دیگر از این انتشارات
تبدیل database به laravel migration درون mysql workbench 8