מדריך התוכנה של רונן

תיכנות, תוכנה,

בקרים – רקע כללי

היות ו – MVC מורכב משלושה אלמנטים עיקריים (מודל, תצוגה ובקר) חשוב להכיר את כל האלמנטים ע"מ להבין טוב כיצד הדברים מתקשרים.

מכיוון שצריך להתחיל מהיכן שהוא אז ראוי להתחיל מהבקר היות והוא זה שמנצח על הכל בסופו של דבר. הבקר ראוי לפרק נפרד משל עצמו אבל החלטתי להתחיל איתו דווקא בהתחלה כדי לתת מושג מה בעצם מתרחש בסופו של דבר ואז יהיה קל להסביר את השלבים הבאים ומי מטפל בהם.

הבקרים אחראים להגיב לקלט מהשתמש ולפעמים מחזירים תגובה למשתמש לאחר ביצוע שינויים במודל בהתאם לקלט שקיבלנו ומה שביקשנו שיעשה.

הבקרים מטפלים בנתונים נכנסים ובהתאם בונים את התצוגה שלא כמו בעבר בהם שרתי אינטרנט נדרשו לייצר דפי HTML שהופקו על ידי סקריפטים.

פלטפורמת MVC עושה זאת שונה ע"י ניתוח ה URL שמתקבלת מהלקוח ומאפשרת למנגנון הניתוב, ובהתאם באיזו תצוגה להשתמש והיא זו שתפיק את מסמך ה HTML הדרוש.

במקום קשר ישיר בין שורת ה URL שניתבה לקובץ ספציפי שישב פיזית בשרת אשר היה מגיב לאירוע כגון Click אשר בהתאם היה בונה את התוצאה עם הדף באופן דינאמי, ב MVC יש קשר ישיר בין שורת ה URL ושיטת מחלקת הבקר שקוראת לשיטה ולא לדף שמופק דינאמי באמצעות סקריפט, הבקר למעשה נמצא לפני כל שאר האלמנטים והוא זה שמנצח על המשתמש עם אובייקטי המודל ועם התצוגה.

הבקרים הם אלו שאחראים לביצוע השינויים הנדרשים במודולי האובייקט ותגובה למשתמש בהתאם.

בניגוד גמור לתשתיות מבוססי קבצים כמו Web Forms או PHP שניתן להגיע לדפי תצוגה ע"י הקלדה ישירה ב – URL של נתיב הדף, ב – MVC התצוגות עצמן אינן נגישות באופן ישיר ולא ניתן לפנות דרך הדפדפן לתצוגה. מימוש התצוגה ב – MVC מתבצע תמיד באמצעות הבקר אשר מחליט איזו תצוגה ואילו נתונים להחזיר.

לדוגמא:
בקוד ASPX היינו אמורים לפנות לדף ספציפי ע"י פנייה ולבקש ממנו לבצע עבורנו את העבודה, לדוגמא:
http://cheaper.co.il/regularsaledetails.aspx?productID=1873

אילו בדף MVC אנחנו שולחים מידע לבקר, למשל ניקח דף של הבקר וננתח אותו:

2013-11-25_1114

כמו שניתן לראות בשורה השנייה מה שמסגיר את העובדה שאנחנו עובדים עם בקר הינה הירושה ממחלקת הבסיס: public class StoreController : Controller.

הקוד:  HttpUtility.HtmlEncode מטהר את ה HTML שחוזר כדי למנוע הזרקת JS או HTML לקוד שלנו.

כדי להבין את צורת העבודה לקונטרול ישירות ב – URL  ונראה שלפי הפנייה אני יכול לגשת ישירות לאירוע המטפל בתוך אותו הדף, למשל אם נקליד את הכתובת על שרת locali:
http://localhost:5957/store – נקבל את המחרוזת שביקשנו מה Index לטפל: 
()Hello from Store.Index

אם נרצה נוכל לפנות גם ישירות לאירוע Browse בבקר והוא יחזיר לנו רק את מה שהוא נדרש לבצע ללא תלות בכל האלמנטים בדף, נוכל לעשות זאת ע"י פנייה ישירה:
http://localhost:5957/store/browse?genre=Disco כמו שניתן לראות ביקשנו מה – Browse בתוך הבקר לשלוף ערך של מחרוזת של ג'אנר שמתקבל והפלט שקיבלנו אלינו היא:
Store.Browse, genre = Disco

עכשיו נפנה ישירות לאירוע Details נשלח לו מספר כלשהוא ונבקש שיחזיר אותו, כמובן שיכולנו בהתאם ל – ID לבקש לשלוף מבסיס נתונים או לבצע פעולות חישוב וכיו"ב על הערך המתקבל ובהתאם להחזיר, אבל פה ביקשנו רק שיחזיר את המספר שמקבל ממה שנשלח לו ב – URL ע"י הפנייה:
http://localhost:5957/store/details/5
והפלט שקיבלנו: Store.Details, id = 5

לסיכום:
ניתן לפנות לאובייקטים שונים בבקר באופן בלתי תלוי בתצוגה או במודל או בכל הבקר ולבקש תגובה לאירוע ספציפי בבקר ולא לשלוח את לכל הדף לשרת (שעשוי להכיל הרבה אירועים ולקחת זמן רב לנתח את הנדרש) ולבקש ממנו לבחור את התצוגה המתאימה שתוחזר למשתמש בתגובה לקלט ההתחלתי שלו.

הדוגמה בפוסט זה הינו תיאור פשוט אבל יעיל להבנת עיקרון הפעולה של הבקרים, אך ברוב המקרים אתרי האינטרנט שנציג יהיו דינאמיים ופעולתם של הבקרים תהיה לבצע פעולות ושאילתות מורכבות ולהחזיר HTML בהתאם, בתצוגה שנבחר.