
הטקסט המלא של הדקות הראשונות בהרצאה «יצירת פילטרים» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אנחנו מגיעים לנושא שנקרא פילטר או פילטרס. מה זה פילטר? פילטר זה שם שיכול טיפה לבלבל כי נראה שזה בעצם משהו שמבצע פילטרינג או סינון כלשהו כך שהוא מוציא דברים החוצה אבל למעשה זה לא המצב.
פילטר זה סך הכל אטריביוט שאנחנו יכולים להוסיף ברמה של אקשן ברמה של קונטרולר ואז הוא תקף לכל האקשנים בקונטרולר או ברמה של כל האתר ואז הוא תקף לכל האקשנים בכל הקונטרולרס שבכל האתר שלנו.
וכל מה שהאטריביוט הזה עושה זה פשוט מריץ קוד כאשר אקשן מסוימת מתבצעת. לקוח גולש לאיזשהו אקשן ואנחנו רוצים להוציא לפועל איזשהו קוד כאשר הוא גולש לאקשן ואנחנו גם יכולים לקבל נתונים על איזה אקשן הוא גלש, איזה קונטרולר, על הריקווסט של המשתמש ולבצע כל מיני דברים
כמו לגלוש לכל מיני מקומות אחרים או לבצע כל מיני פעולות אז בואו נראה איך זה מתבצע קודם כל אם יש לנו איזשהו קונטרולר מסוים בואו נוסיף פה קונטרולר נקרא לו טסטר ויש לנו כמובן אקשן או אקשנס בתוך הקונטרולר הזה אנחנו מוסיפים את הפילטר על ידי סוגריים מרובעות כאטריביוט רגיל מעל לאקשן ואז הפילטר הזה תקף רק לאקשן
או שמוסיפים אותו לקונטרולר והוא תקף לכל האקשנים רק בקונטרולר הזה או שאנחנו יכולים ללכת לתיקיית אפסטארט לפילטר קונפיד ולרשום אותו כאן על ידי filters.add ולהוסיף את הפילטר שלנו ואז הוא תקף לכל האקשנים בכל הקונטרולרס שבאתר.
אז בואו כרגע נבנה בעצמנו איזשהו פילטר ונראה איך משתמשים איתו. דבר ראשון מה שנעשה זה נוסיף תיקייה שנקראת filters שתחזיק את כל הפילטרים שאנחנו הולכים לבנות.
בואו נוסיף תיקייה, נקרא לה Filters בתוך התיקייה הזאת נוסיף קלאס ובואו נחשוב איזה פילטר אנחנו הולכים לבנות. נניח שאנחנו רוצים לבנות איזשהו פילטר שכאשר גולשים לאקשן שהפילטר הזה ניתן לאקשן אנחנו רוצים לרשום לקובץ לוג שהמשתמש גלש לאקשן הספציפי הזה.
אז בואו נקרא לפילטר הזה לוגר בגלל שפילטר זה אטריביוט מאוד מומלץ לסיים אותו במילה אטריביוט. ואנחנו בונים קלאס שנקראת FilterAttribute. נוריד את המרחב שמות הזה, נישאר במרחב שמות הכללי של כל האפליקציה.
אנחנו צריכים לרשת בשביל שזה יהיה באמת Filter@ActionFilterAttribute. ActionFilterAttribute נמצא במרחב השמות SystemWebMVC ולא SystemWebHTTPFilters, שגם שם נמצא מחלקה דומה.
בנוסף אנחנו צריכים לרשת אינטרפייס שנקרא IActionFilter. בתוך המחלקה שאנחנו בונים עלינו לדרוס פונקציה שנקראת on-action-executing אבל אנחנו צריכים לדרוס אותה בשיטה של implicitly implemented.
מה זה אומר? זה אומר שאנחנו צריכים לרשום את שם האינטרפייס i-action-filter, נקודה ואז שם הפונקציה בלי המילה public. זאתי שיטה מסוימת לבצע דריסה של פונקציה שנמצאת באינטרפייס.
הדבר הבא שאנחנו צריכים לעשות זה כמובן לרשום את הפרמטרים. היא מקבלת Action Executing Context, וזה בעצם איזשהו משתנה שמחזיק מידע לגבי הגלישה הנוכחית שהתבצעה.
עכשיו בואו פשוט נרשום לתוך איזשהו קובץ לוג את העובדה שהמשתמש גלש לאקשן ספציפית שתתבצע כאשר המשתמש יגלוש אליה, וכמובן שהפונקציה הזאת תתבצע רק אם הפילטר שאנחנו נותנים יהיה תקף לגבי אותו action.
אז בואו נרשום פה using, נפתח stream writer, נפתח כאן איזשהו stream find name, ואנחנו רוצים לגלוש לקובץ שנמצא באתר, לכן אנחנו צריכים לקבל את הנתיב המלא של האתר בצד של השרת.
אנחנו לא יכולים סתם לרשום איזשהו שם של קובץ, אלא אנחנו צריכים להגיע לנתיב המלא, וזה מתבצע על ידי http-context-current-server-map-path ולתת ל-map-path את הנתיב היחסי של האתר שלנו, זאת אומרת התיקייה של האתר, סלאש ממציא איזשהו שם logger.log ואז הפונקציה
מה-path תחזיר לנו את הנתיב המלא בו האתר שלנו נמצא בצד של השרת. נרשום את ה-fine name ונוסיף את המאפיין true עבור append, כלומר כל פעם שגולשים אנחנו רוצים להוסיף את המידע לקובץ טקסט ולא לדרוס אותו.
אז בואו נרשום writer.rightline ונתחיל לרשום פרמטרים. לדוגמה time מהי השעה המדויקת שהמשתמש גלש לאקשן.
ניקח daytime.now נוסיף controller מהו ה-controller שהמשתמש גלש אליו. ניקח בפילטר קונטקסט את ActionDescriptor מידע לגבי האקשן, קונטרולר דסקריפטור זה מידע לגבי הקונטרולר וקונטרולר name זה השם של הקונטרולר שאליו התבצעה גלישה.
לאחר מכן מה האקשן? זה יהיה ב-filter context action description action name. לאחר מכן בואו נוסיף גם את ה-user IP. נניח שאנחנו רוצים גם את ה-IP שלו.
כאן אנחנו צריכים להגיע על ידי filter context HTTP context request זה בעצם ה-request עם כל הפרמטרים שהגיעו מהלקוח. ונלך ל-user-host-address שזה ה-IP של המשתמש.
ואנחנו רשמנו כל מיני דברים כאשר התבצעה גלישה לאיזשהו אקשן. עכשיו נקודה חשובה נוספת ואנחנו צריכים ללכת לפונקציית on-action-executing ולשלוח לה את ה-filter-context מפני שביצענו פה מעין דריסה כזאת ואנחנו רוצים שהפונקציה המקורית גם היא תתבצע.
פה סיימנו לבנות את פילטר שלנו ומה שנשאר לנו לעשות זה להשתמש איתו אז בואו נראה שלוש שיטות להשתמש בפילטר