[סמינר] [קוהנה: קל משקל PHP Framework] [ברנדון ליו] [אוניברסיטת הרווארד] [זה CS50.] [CS50.TV] שלום לכולם. השם שלי הוא ברנדון. אני זוטר כאן במדעי מחשב במכללה עושה, והיום אנחנו הולכים לדבר על קוהנה, שהוא במסגרת פיתוח PHP אינטרנט. היום הולך להיות סמינר קידוד חי, אז אני בעצם הולך לבלות 5-10 דקות להסביר מה היא קוהנה, ואז אני ממש הולך לבנות בלוג פשוט סופר בשבילך ממש כאן ממש מהתחלה. אנחנו הולכים להוריד את הקוד מאתר קוהנה, ואנחנו הולכים להתחיל בבניית בלוג, ואני מקווה שזה אהיה מאוד מאלפת, בגלל שאתה תראה אולי אולי אני לעשות כמה טעויות, ותראה לי להתאושש מהם, או שאתה תראה את תהליך המחשבה שלי כפי שאני לבנות באמצעות הבלוג הזה, ובינתיים, תוכל גם להכיר את המסגרת עצמה. אני מקווה שזה אהיה תרגיל מאוד מאלף. ראשית, מה בדיוק היא מסגרת? אם אתה כבר לוקח CS50 עד כה, שלא באמת עבד עם כל מסגרות עדיין, והדבר הוא זה. אתה כנראה עשית pset התפתחות האינטרנט 1 כבר, ונניח שאתה ממשיך לבנות אתרי אינטרנט ולשמור על אתרי בנייה. אתה מתחיל לשים לב לכמה דברים. הדבר הראשון שתבחין הוא שאתה כנראה עושה את אותם דברים שוב ושוב כל הזמן, דברים כמו ניקוי נתוני קלט משתמש, דברים כמו ארגון הקבצים שלך בצורה מסוימת. הדבר השני שאתה גם בטח שם הלב הוא שהקוד שלך אולי מתחיל להיות מאוד מאוד מבולגן, ואתה יכול להשאיר אותו מבולגן ופשוט יש לי קשה מאוד לשמור עליו, או שאתה יכול להתחיל לבנות את הקוד שלך ולהפוך אותו מודולרי בדרכים מסוימות כדי לעשות את זה יותר לתחזוקה. זה מקום שבי מסגרות אינטרנט הגיעו בעצם פנימה אנשים אלה שבנו הרבה אתרי אינטרנט, הם אמרו, "אנחנו לא צריכים לעשות שוב את זה בכל פעם שאנו בונים אתר אינטרנט." "למה שלא פשוט לעשות את חבילה שעושה את כל הדברים האלה בשבילך כל פעם שאתה רוצה לבנות אתר? " וכך שכאשר אתה להפוך את אתר אינטרנט חדש, אתה פשוט להתמקד במה הוא בדיוק האתר המסוים הזה עליו. אתה לא צריך לחזור על כל התצורה השונות והפרדה של קודים וקוד שכתוב כי לעתים קרובות אתה צריך לעשות כשאתה עושה אתרי אינטרנט. הרעיון הוא שמסגרת מאפשרת לך לכתוב קוד ברמה גבוהה יותר מבלי לדאוג לפרטים ברמה נמוכה יותר. פירוט ברמה נמוכה יותר יכול להיות משהו כמו התמודדות עם ניקוי נתוני קלט משתמש. זה משהו שאתה לא צריך באמת צריך לדאוג. אתה צריך להתמקד במה שהקצאת האינטרנט שלך היא בעצם עליו. זה מבטל הרבה קוד מוכן מראש. זה אדריכלות לפרויקט שלך. אחד הפופולריים ביותר יהיה Model-View-Controller, שאני הולך לדבר על בשנייה. והרבה פעמים מסגרות אלו מגלמות קבוצה של נהלים, כללים ושיטות עבודה מומלצות כדי שתוכלו להשתמש כך שכאשר אתה מאמץ את מסגרת האינטרנט אתה צריך לכתוב את הקוד שלך בצורה מסוימת, וזה בדרך כלל מוסכם סדרה של עקרונות על ידי הקהילה שמקובלת בדרך כלל להיות דרך טובה של כתיבת קוד. זה הופך את הקוד שלך יותר לתחזוקה, שימושי יותר, כן הלאה וכן הלאה. ולבסוף, הדבר שאני רוצה להדגיש על מסגרות לעומת ספריות הוא הרעיון הזה על היפוך של שליטה, והדבר הוא זה. ההבדל בין ספרייה ומסגרת הוא שעם ספרייה אתה עדיין כותב את התכנית הראשית, ואתה סוג של פנייה לספרייה וקורא לספרייה כדי לעשות משהו בשבילך. ההבדל בין ספרייה ומסגרת הוא שהמסגרת מתחילה עם השליטה, וזה מעורר את הקוד שלך, כך שאתה יכול לחשוב על זה כ-- זו הסיבה שקוראה לזה מסגרת - המסגרת מספקת מסגרת זו ומבנה לקוד שלך, ולמלא את החורים, וזה יהיה לעין יותר בשנייה כשאתה רואה אותי להתחיל לכתוב קוד בהקשר של המסגרת. אתה רואה שאני ממלא את הפערים, והמסגרת היא סוג של שליטה בכל החלקים הנעים, ואני צריך לשים את החתיכות במקומות הנכונים. היום אנחנו הולכים לדבר על קוהנה, שהיא אחת ממסגרות PHP רבות. ישנן מסגרות באינטרנט, ויש כאלה כמעט בכל שפה, ואני אוסף קוהנה בגלל קוהנה היא לטעון ומוכר בדרך כלל כמסגרת PHP הכי הקלה להרים. זה קל ביותר. ישנן האחרים שם בחוץ שמגיעים עם הרבה, הרבה יותר תכונות, אבל הם נוטים להיות יותר קשים להרים. ולבסוף, קוהנה משתמשת בארכיטקטורת MVC. זה קל מספיק שאנחנו ממש יכולים לבנות פרויקט ממש כאן ממש מול העיניים שלך, ואתה יכול פחות או יותר פעל יחד די בקלות. מהי ארכיטקטורת MVC? מייצג Model-View-Controller זה, ואולי אם אתה חושב על הקוד שאתה כבר כותב עד כה עבור חלק מpsets פיתוח האינטרנט שלך ייתכן שתוכל לראות חלק מזה, אבל בדרך כלל כשאתה מתחיל בכתיבה יישום אינטרנט מורכב יותר, החלוקה בין 3 מגזרים אלה הופכת להיות יותר ויותר ברורים. הנחתי את MVC כאן כערימת סוג של, ולעתים קרובות אתה שומע אנשים מדברים על ערימות בפיתוח אינטרנט, וזה כדי להמחיש את הרעיון כי כל שכבה, כל רכיב באמת מנסה לתקשר רק בין 2 רכיבים אחרים. מישהו ניגש לאתר שלך כלקוח או דפדפן. האינטראקציה שלהם עם התכנית שלך באמצעות קוד התצוגה. קוד תצוגת אינטראקציה עם הבקר. בקר אינטראקציה עם המודל, ומודל אינטראקציה עם מסד נתונים SQL. ואין מקפץ בין אם אתה כותב את הקוד שלך כמו שצריך. מה הדברים האלה עושים? המודל במהותו הוא פיסת הקוד העוסקת בנתונים שלך. כל דבר שעוסק במסד הנתונים שלך, עם החפצים שאתם מאחסנים, או אחזור אלה אובייקטים במסד הנתונים, שכל מטופלים על ידי המודל. אולי יש לך אובייקטים במסד הנתונים שלך. אנחנו הולכים ליצור מודל שקשור להודעות, כך הודעה יכולה להיות כמה תכונות אליו. ייתכן שיש לך פונקציות סביב אחסון הודעות אלה או אחזור הודעות או סינון ההודעות וכן הלאה וכן הלאה, וזה כל הקוד שמטופל על ידי המודל. בקר הוא סוג של היגיון היישום, והרבה דברים שונים יכול ללכת בהיגיון היישום. אם אתה מדבר עם ה-API שונה, שעשוי להיות עם היגיון היישום שבו אתה מתעסק. אם אתה מנסה צריך להביא נתונים ממודלים שונים מרובים וצריך לשלב אותם בדרך כלשהי, כי לעתים קרובות יכולה להיות מטופלים על ידי הבקר. לדוגמא, בפייסבוק, אם מישהו שאתה חבר, אז אולי מעשה זה של הקמת מערכת יחסים ש ניתן לעשות זאת על ידי בקר. ולבסוף, את הנוף הוא הקוד שהניב את מה שאתה באמת רואה. הרבה פעמים אני חושב בpsets CS50 הם לא ממש ממליצים לך החבר 'ה כדי להפריד 3 הדברים האלה. בטח יש לך קובץ הגדול, הארוך הזה שבו בחלק העליון שלך לעשות קצת שאילתת SQL ואולי לעשות קצת עיבוד על הנתונים שנאספו מבסיס הנתונים, ואז יש לך את כל HTML שלך בתחתית. ואתה עשוי לגלות כי כמו שאתה יוצר יותר ויותר דפים כי אתה הולך לקבל קצת חזרה קוד, וגם, העניין הוא הקובץ שלך מקבל באמת גדול וארוך והופך להיות מסורבל לניהול. הסיבה MVC הוא כל כך נחשב גם הוא עבור מספר הסיבות. הדבר הראשון שנקרא משהו הפרדת חששות של המהווה את הרעיון שכאשר יש לך - באופן אידיאלי פיסת הקוד 1 צריכה לעשות את הדבר 1 ועושה את זה ממש טוב, ואתה לא צריך לשלב את פיסות קוד שעושות דברים שונים. לדוגמא, להציג את קוד ואת קוד דגם, הם לא באמת צריכים להיות קשורים. הם לא חייבים להיות באותם קבצים, ולכן כאשר אתה יכול, להפריד אותם כך שזה קל לתחזוקה. הדבר השני הוא שימוש חוזר בקוד. אתה עלול למצוא את עצמך כותב את אותה שאילתת SQL או עושה שאילתות דומות שיכול להיות מפוזרת לפונקציה 1, וזה הרעיון שעומד מאחורי מודלים ובקרים, יש את זה בפונקציה נפרדת, כי אתה יכול לעשות שימוש חוזר במקומות שונים בפרוייקט. ולבסוף, זה קשור לייבוש את הקוד שלך, או לא לחזור על עצמך, לא לחזור על עצמך. זה מאוד מובן בפיתוח. כל פעם שאתה יכול, אתה לא רוצה לחזור על עצמך, כי אם אתה חוזר על עצמך,  זה הרבה יותר יקר לתחזוקה. אם ברצונך לשנות דבר 1, אתה צריך לשנות את זה בכל מקום, ושמוביל לבאגים, וזה נורא. בסדר. כל שאלות עד כה על קוהנה בבת? גדול. עכשיו אנחנו הולכים לצלול לתוך מושב הקידוד החי, ואנו מקווים שהכל ילך כשורה. אני הולך בעצם לבנות את אתר האינטרנט הזה על אחד מהשרתים המרוחקים שלי, וככה גם אתם יכולים לראות את האתר ולהיכנס לאתר, וגם הסביבה היא טוב יותר מוגדרת מאשר המחשב המרוחק שלי, כי זה מפעיל לינוקס במקום OS X. אנחנו ממש הולכים להתחיל. KohanaFramework.org. אני הולך להוריד את הקוד מאתר. אני הולך להעתיק את כתובת הקישור, ללכת לשרת שלי, להוריד אותו, ואני הולך לחלץ אותו. [סטודנטים] מה הגדול ביותר שאתה יכול להפוך את הטקסט? [ברנדון ליו] האם זה טוב יותר? [סטודנטים] האם זה אפשרי? [ברנדון ליו] כן, זה בסדר. אני הורדתי קובץ ZIP ופתחתי את הרוכסן שלתוך ספרייה בשם קוהנה, ואנחנו הולכים לשנות את השם שCS50-קוהנה, ובואו נלך פנימה מדהים. כאן אתה רואה חבורה של קבצים שונים. רובכם יכול להתעלם - אנחנו גוף לא הולך לעבור כל קובץ שהוא בכאן בגלל אילוצי הזמן שלנו, אבל בדרך כלל בעת התקנת קוהנה, הדבר הראשון שאתה עושה הוא שאתה הולך לספרייה, ואתה בעצם לעשות כמה בדיקות סביבה ומה לא כדי לוודא שהסביבה שלך מוגדרת כראוי לרוץ קוהנה ולוודא שהכל בסדר. אתה יכול לראות את רוב הדברים העבירו, אבל בדרך כלל אתה תמיד נתקל בבעית 1 שבו הוא מתלונן על כך שחלק מהספרייה אינה ניתן לכתיבה, וזה בגלל כמה הרשאות. אני לא יודע עד כמה אתם חבר 'ה שלמדו על הרשאות קבצים בCS50, אבל אם אתה עושה את פיתוח אינטרנט, אתה הולך להיתקל בנושא זה הרבה. אני הולך לעשות את זה לצריבה ואני חושב שיש לי גם - שם אנחנו הולכים. אוקיי, אז עכשיו אתה יכול לראות כל מה שעברת, ועכשיו הוא יגיד לך לשנות את שם קובץ install.php. אני הולך להעביר את קובץ install.php לinstalled.php, ועכשיו אם אני לרענן, זה נותן לי איזו שגיאה, וזה מקום שבי הניפוי נכנס זה מקום שבו אתה יכול לראות מה באמת הולך לקרות. העניין הוא, כברירת מחדל, קוהנה מניחה כי הפרויקט שלך הוא בספריית השורש של התחום שלך, כך שמצפה לך להיות בdemo.brandonkliu.com. אנחנו צריכים להגיד לו שזה בעצם בתיקיית משנה. שהוא בתיקיית משנה בשם CS50 קוהנה. העניין הוא, שזה פרשנות שגוי CS50-קוהנה כמו משהו אחר, שאני אסביר לך בשנייה. אבל אני צריך להגיד לך שזה משהו שזה היה צפוי. מה שאנחנו הולכים לעשות הוא שאנחנו הולכים להיכנס לתיקייה זו נקראת bootstrap.php, שהיא תיקיית התצורה שבו הרבה דברים שונים מוגדרות. אני פותח את זה. אז אולי אחד הדברים הראשונים שאעשה הוא לשנות את אזור הזמן. ואז בואו נראה. אהה! ממש כאן. יש חבורה של אמרות תצורה שונות בפה, אבל אחד שאני מחפש הוא הדבר הזה שנקרא URL בסיס, וברירת המחדל אני מקבל את זה שנקבע לקוהנה, אבל אני הולך לשנות את זה לCS50-קוהנה, ואני חושב שצריך לתקן את זה. כן, גדול. כברירת מחדל, כדי לראות שזה עובד, הוא אומר, "שלום העולם". מאיפה זה בא? איך הגעתי לשלום העולם? איפה בדיוק נמצא הקוד שבעצם כתב את זה? כדי להבין את זה, אני אציג את המושג הזה שנקרא ניתוב. פחות או יותר כל מסגרות אינטרנט המושג שנקרא ניתוב, אשר היא פיסת התוכנה שתמפה URL מסוימת לפיסה מסוימת של קוד במסגרת שלך. לדוגמא, אם יש לך כמה כתובות URL ואתה הולך לחלק כתובת אתר כמו foo.com / בלוג / כל אז מה המסגרת הוא הולכת לעשות - או לפחות מה קוהנה הוא הולכת לעשות - הוא שזה הולך למצוא בכיתה קראה את הבלוג של בקר, וזה הולך להפעיל את פעולת פונקציה בשם כולם. אני יודע על כיתה ופונקציות אני מדבר, ואני יודע שאתם לא מכוסים שיעורים ואירועים בCS50 עדיין, אך לעת עתה, אתה יכול לחשוב על שיעורים כמו סתם קבוצה של פונקציות, דרך של קיבוץ פונקציות ביחד. זה באמת כל מה שאתה צריך לדעת. עכשיו, אם אנחנו מסתכלים על מבנה התיקיות שלנו, בתוך תיקיית היישום יש תיקייה נוספת בשם כיתות, והתיקיות האחרות נקראות בקר ודגם. אם תסתכל בתוך תיקיית בקר, אנו רואים שיש קובץ שנקרא ברוך הבא, ואתם יכולים לראות כאן הוא מחלקה בשם ברוך הבא בקר, ויש פונקציה שנקראת פעולה מדד ומה שהיא עושה זה מגדיר את הגוף של התגובה שלך לשלום העולם. זה מקום שבי הקוד הוא להיות בכתב. השאלה אחרת הוא, טובה, אני לא הלכתי ל בלה, בלה, בלה, / בברכה / מדד. איך בכלל הגעתי לכאן? ובכן, זה פשוט כי כאן בחלק התחתון של קובץ bootstrap שלנו שבו אנו קובעים מסלולים שלנו אתה יכול לראות שהם להגדיר כמה ברירות מחדל עבורך. בקר ברירת המחדל הוא ברוך הבא. פעולת ברירת המחדל היא מדד. זו הסיבה שכאשר אנחנו שמים שום דבר שם זה באופן אוטומטי נכנס לבקר ברוך הבא ופעולת המדד. כל מה שהגיוני עד כה? עכשיו, אתה יכול לעשות יותר מאשר רק ללכת לפיקוח ופעולה ספציפית. אתה יכול גם לעבור בפרמטרים אל הבקר. רק כדוגמא, אני הולך להוסיף עוד פעולה לבקר זה כדי להראות לך. בואו לקרוא את הפעולה הזו אקו, כי זה הולך לספר לכם כל מה שאתה נותן לו, ואז אני בעצם הולך לתפוס פרמטר זה הולך להישלח דרכי לתכנית הניתוב, וכמו שאתה יכול לראות כאן, קו זה ממש כאן, אתה יכול לראות את זה זה בעצם אומר שיש לך בקר, ויש לך /, ויש לך פעולה, ויש לך / אחר, וזה הולך להיות פרמטרים, ובגלל שיש לנו את זה שם זיהוי בתוך סוגריים משולשים, זה אומר שאנחנו מזהה שמות בפרמטר זה. מאוחר יותר בקוד הבקר שלי, אם אני רוצה לתפוס אחיזה של פרמטר זה, אני יכול להשתמש בקוד שכתבתי, למצוא את הפרמטר בשם זהות. זה מה שעשיתי כאן, ואני הולך לחזור ולומר, "אתה אמר" את זה. ואז עכשיו אם אני הולך לאתר שלנו, אני הולך לcs50-kohana/welcome/echo/Helloooo-- אה, זה נכון. יש שלב 1 שאני נשאר בחוץ. זהו חלק מרעיון קידוד בשידור חי. הנה דבר 1. בואו נראה. אז בדרך כלל כברירת מחדל עם הרבה יישומי אינטרנט אלה אתה צריך לכלול דבר index.php זו בכתובת האתר שלך, כי הרעיון הוא index.php הוא סוג של נקודת הכניסה הבקשה שלך, אבל כמובן, זה סוג של מעצבן שיש. אתה לא רוצה שתהיה לי index.php יופיע בכתובת האתר שלך, ופחות או יותר בכל מסגרת אינטרנט מחוץ לקופסה יש בעיה index.php זה, ולכן אתה צריך לקחת כמה צעדים כדי להיות מסוגל להסיר את זה. ולכן במקרה זה, מה שאנחנו הולכים לעשות הוא שאנחנו הולכים להשתמש בקובץ שנקרא. htaccess, וזה משהו שהוא ייחודי לשרת האינטרנט Apache, והוא יכול לעשות דברים כמו שכתוב כתובות ולהפנות את כתובות אתרים וכן הלאה וכן הלאה, וקוהנה היא נחמדה מספיק כדי לספק קובץ htaccess תבנית. שאנחנו יכולים להשתמש. כפי שאתה יכול לראות, יש קובץ בשם 'example.htaccess, ואנחנו הולכים להעתיק את זה ל. htaccess. אני הולך לפתוח את זה ולערוך אותו, ובעצם זה עושה חבורה של דברים שונים. שורת המפתח ייתכן שתרצו להסתכל על זה ממש כאן. הרעיון הוא שזה מגדיר את כלל שאומר, "אוקיי, מה שאתה מקליד, index.php צרף בתחילת שורה לזה". אתה יכול לראות את זה. . * עומד לכל דבר, להתאים כל דבר, ולאחר מכן החלק השני הוא index.php / 0 $, ו$ 0 מתייחס לכל מה שהתאים בעבר. האם זה הגיוני? אבל הדבר באמת המפתח אני רוצה לשנות הוא לשנות את בסיס שכתוב זה, המהווה את בסיס כתובת האתר. זה סוג של ההנחה שבו אתה עובד. אני הולך להוסיף CS50 קוהנה לזה, וככה עכשיו אם אני מסיר index.php, זה אמור לעבוד, ואני הולך להוסיף קצת מספרים כדי להראות לך שהוא אכן עשה את העבודה. נשמע טוב. כל שאלות עד כה? [סטודנטים] איך זה לדעת לעשות 123? האם זה טיעון? בדיוק. אתה יכול לחשוב על זה בדיוק כמו ויכוח. אבל הדבר המוזר, אם כי, הוא כי דרך קוהנה עושה את זה הוא שהם לא עושים את זה בדיוק כמו ויכוח. אתה צריך לתפוס את זה ככה. אתה צריך לתפוס את אובייקט הבקשה ולבקש את הפרמטר שנקרא תעודת זהות, וכי שם זיהוי מגיע מאותו קובץ bootstrap שהראיתי קודם לכן, ושם היה מזהה בסוגריים זוויתיים אלה, וככה אתה תופס פרמטרים אלה. מדהים. יש עוד שאלות? כמו שאמרתי, בקרים, הם מטפלים בלוגיקת יישום, אז זה דוגמא 1 שבו אתה יכול לראות זהו זה - זה מאוד בסיסי, אבל זה עדיין היגיון יישום, הרעיון תופס את הפרמטר ויצירת מחרוזת חדשה שאומר, "אתה אמר בלה," ולאחר מכן יורק שיחזרו אליך. ובאופן כללי מה שאתה עושה הוא שאתה יוצר בקרים שונים. אתה יוצר בקרים נפרדים לחלקים שונים של האתר שלך. היום אנחנו הולכים לעשות אתר מאוד פשוט, וזה הולך להיות בלוג מאוד בסיסי. אנחנו הולכים להפוך את הבקר חדש רק להודעות בבלוג. אבל אז אם אני היה גם להוסיף הערות לפוסט בבלוג, אז בטח הייתי רוצה לעשות הבקר חדש להערות אלה. אם אני רוצה להוסיף משתמשים, הייתי כנראה להוסיף בקר חדש עבור משתמשים אלה, ובאופן כללי, הרעיון הוא שכל פעם שיש לך מודל חדש, אובייקט נתונים חדש עם שיש לך עסק, יש לך בקר אחד שלאובייקט נתונים. היום אנחנו הולכים לעבודה עם אובייקט נתונים 1 בלבד, וזה הולך להיות הודעות, ואתה יכול גם לחשוב על אובייקטי נתונים כמקבילים לשולחנות. באופן כללי כל שולחן מתאים לסוג 1 של אובייקט נתונים, כך בהודעה השולחן יהיה לי הודעה מודל 1, שיהיה לי הודעה בקר 1 המתאים לכך, ואותו דבר להערות, אותו עבור משתמשים, וכן הלאה וכן הלאה. וזה כלל אצבע. יש הולכים להיות מקרים מיוחדים שבו אתה יכול להיות שונה מזה, אבל 90% מהזמן זה מה שאתה הולך לעשות, ואני אראה לך שזה מה שאנחנו הולכים לעשות היום. 1 יותר מושג לפני שאנחנו צוללים בחזרה לתוך הקוד, הרעיון הזה של מיפוי יחסי אובייקט. כבר אתם עשיתם pset פיתוח אינטרנט, ואתה ראית שאתה מבצע שאילתת SQL, ומה שזה מחזיר לך הן שורות. אתה מקבל שורות אלה, ומדד לך אותם על ידי כמה שם, שמו של הטור והשולחן, וככה אתה עובד עם זה, וזה יכול להיות קצת מסורבל. אבל יתר על כן, אם יש לך קשרים בתוך מסד הנתונים שלך, כמו למשל אם יש לי הערות והודעות, אז אולי אני רוצה לתפוס את ההודעה האם של תגובה. אם אני משתמש רק בשורות SQL, ואז כל מה שאני יכול לקבל הוא מזהה ולא בהודעה בפועל של ההודעה ההורה עצמו. אבל כאשר אנחנו קידוד, מה שאנחנו באמת רוצים הוא לתפוס בפועל  ההורה לפרסם את עצמו לפעמים. מה אובייקט מיפוי יחסי עושה הוא זה לוקח את התוצאות של שאילתת מסד נתונים ומכניס אותו לתוך אובייקטים בשבילך, שהם הרבה יותר נחמדים לעבוד עם זה ממערכים ושורות רגילים. לדוגמא, עכשיו כאשר יש לי הערה אולי, ואני רוצה לתפוס את ההודעה האם שלה, ואני אולי אין להגיב הודעה חץ, אז זה בעצם ייתן לי את ההודעה אובייקט מתאים לתפקיד ההורה בפועל, ולא רק כמה זהות, שבו אני אחר היה צריך להשתמש ולעשות שאילתת SQL אחרת כדי לתפוס את ההודעה, שהוא מסורבל ומיותר. יתר על כן, על ידי מיפוי כל שורות נתונים אלה לאובייקטים, גם אתה יכול לצרף עוד פונקציות לאובייקטים, כך למשל, דיברתי על איך שיעורים הם בעצם קבוצות של פונקציות. אתה יכול לחשוב על זה ככה. לדוגמא, אולי יש לי הודעה האובייקט הזה, ואולי הייתי רוצה לקבל קצת סוג של פונקציה קשורה אליו שבעצם אומר לי שזה פורסם לאחרונה? היה זה פורסם בשבוע שעבר, אמת או שקר? וזה פונקציה שאני יכול לצרף אל אובייקט ש, וזה ממש נוח לו באותו המקום, ויש שורה של פונקציות שונות שתוכל ליצור לחפצים הללו, וזה ממש נחמד להיות מסוגל לצרף אותו לכיתה, לאובייקט, ואילו אם רק היו שורות המגיעות מבסיס הנתונים שלך, אז אתה באמת לא יכול לצרף כל הפונקציונליות לזה. זה ממש פשוט נתונים. כל שאלות על זה בכלל? ORMs הוא התפתחות אינטרנט נפוצה מאוד, ויש הרבה סוגים שונים של ORMs של, וקוהנה יש ORM משלו. זה מאוד בסיסי, אבל תוכל לקבל טעימה ממה שזה נראה. בואו ליצור מודל שנכתב בבלוג שלנו, והדבר הראשון שאנחנו כמובן צריכים לעשות הוא ליצור שולחן בפועל בתוך מסד הנתונים שלנו כדי לאחסן למעשה הנתונים שלנו להודעות אלה. הדבר הראשון שאני הולך לעשות זה ללכת לphpMyAdmin. האם אתם משמשים phpMyAdmin לפני? אוקיי, מגניב, אז אתם כבר יודעים מה זה, ואני הולך ליצור טבלה חדשה בשם הודעות קוהנה, וזה הולך להיות ממש פשוט. אני אצטרך להיכנס שוב פנימה כל מה שאנחנו הולכים לעשות היום הוא שיש לי מחבר וגוף, פשוט לשמור את זה פשוט. אני הולך ליצור טבלה, ועכשיו פשוט יש לנו טבלה המייצגת את ההודעות שלנו עם 2 שדות לסופר שלנו והגוף שלנו. הדבר השני שאני הולך לעשות עכשיו הוא להגדיר את יישום האינטרנט שלי, כך שהוא יודע איך להתחבר למסד הנתונים, וזה, שוב, זה משהו שאתה תצטרך לעשות עם כל יישומי האינטרנט. אתה צריך להגיד לו את השם המשתמש ואת הסיסמה ואת שמו של מסד הנתונים וכן הלאה וכן הלאה כדי להבין איך בעצם להתחבר למסד הנתונים שלך. בקוהנה, יש לנו משהו שנקרא מודול בסיס הנתונים, ובתיקיית התצורה יש לנו תיקייה בשם מסד נתונים, וכמו שאתה יכול לראות, יש חבורה של הגדרות שאתה צריך להגדיר כאן לספר לו מה שם המשתמש והסיסמה עבור מסד הנתונים, כך שאני ממש יכול להתחבר אליו. ומכיוון שאני לא רוצה שהחבר 'ה יודע בעצם שם המשתמש וסיסמא של מסד הנתונים שלי, יש לי קובץ שבו אני כבר להגדיר את כל זה, ואני הולך להעתיק ולהדביק אותו מעל. מדהים. אוקיי. אני חושב שזה כל התצורה שאני צריך לעשות, אבל בואו נראה. אנחנו נמשיך לעבוד בזה, ואם משהו מתרסק, אז אנחנו נתקן את זה. עכשיו מה שאני הולך לעשות הוא שאני הולך ליצור בקר חדש. או בעצם, סליחה. קודם כל אני חייב ליצור מודל חדש. אני ליצור מודל חדש בשם Post.php, ומה שאנחנו הולכים לעשות הוא שאנחנו הולכים לקרוא לזה Model_Post כיתה. קבל כמה הדגשת תחביר ב, ולכן כאשר אני אומר, "מרחיב ORM," זה בעצם עוד קצת תכנות מונחה עצמים, שלמרבה הצער לא חבר 'ה למדה בCS50 עדיין, אבל זה די קל להרים. זה נותן לי את כל הפונקציונליות נוספת הזה שמגיע בחבילת ORM זה, ואז אני מקבל חבורה של פונקציות ומה לא בחינם נוספים, שתראה קצת בשנייה. נכון לעכשיו בעצם כל מה שאני צריך לעשות הוא ליצור המעמד הזה. אני אפילו לא צריך לעשות כל תפקיד או כל דבר, אבל אני כבר יצרתי מעמד שמייצג את הטבלה, ומכיוון שאני כבר הארכתי בכיתה ORM זה, אני מקבל המון דברים בחינם, אז עכשיו אתה לא צריך להגדיר יותר על שום דבר. ועכשיו מה שאני הולך לעשות הוא שאני הולך ליצור בקר חדש, שאני הולך לשם blog.php, ואני הולך להעתיק את הבקר ברוך הבא אז אני לא צריך להקליד מחדש כמה דברים, ועכשיו אני צריך לשנות את השם הזה. עכשיו מה שאני הולך לעשות כדי לבדוק כדי לוודא שהכל מסתדר, אני הולך לתפוס את ההודעה הראשונה ממאגר הנתונים שלי ולהדפיס את הגוף של ההודעה על המסך. כדי לעשות את זה מה שאני הולך לעשות הוא ראשון שאני הולך לשמור את ההודעות למשתנה אז מה שאנחנו הולכים לעשות הוא - בקוהנה מה שאתה עושה הוא לתפוס את ההודעה האובייקט זה סוג של מסורבל, אבל אתה צריך לעשות את הדבר הזה שנקרא ORM :: מפעל, ואז אתה עובר בשמו של המודל שאתה רוצה, וזה מחזיר את אובייקט ORM שמייצג את המודל הזה. ואז, כמו שאמרתי, כאשר אנו מרחיבים את אובייקט ORM, אנחנו מקבלים את כל השיטות הללו בחינם, כך לדוגמא, אנחנו מקבלים הפונקציה החדשה הזה שנקרא "למצוא את כל" אשר באופן אוטומטי חוזר בכל הודעה במסד הנתונים, וזה די נוח. ועכשיו בגוף אני הולך לחזור בהודעה הראשונה ולהחזיר את הגוף שלה. וכמובן, אני צריך ליצור הודעה, אז בואו להוסיף הודעה חדשה. אני אומר, "ברנדון, ההודעה הראשונה שלי." מדהים. ועכשיו אנחנו הולכים לבלוגים ואם כל מה שעובד היטב - הו, זה משהו רשות קובץ מטומטם אחר שוב. חכה שני 1. זה סוג של האבסורד. הנה. אוקיי. אני תקנתי את הבעיה שרשותו. הוא מנסה ליצור כמה קבצים וכמה יומן, וההרשאות, שוב, לא היו מוגדרות כהלכה, אז עשיתי את זה כך הקבצים אלה היו לצריבה והפעלה כך שזה באמת יכול להיכנס לדברים. עכשיו זה נותן לי עוד לומר יוצא מן הכלל, "ORM הכיתה לא נמצא," וזה בגלל ששכחתי את צעד נוסף. זה חבל מאוד. בקובץ תיקיית אתחול, יש מודולים אלה כאן, שבו אתה יכול לבחור להפעיל או לבטל. אלה הם חבורה של תכונות שונות, כי אתה יכול לבחור להשתמש בתוך קוהנה, שהיא סוג של נחמד. לדוגמא, יש להם מודול אימות שבו אתה יכול להשתמש לאימות משתמשים. יש להם מודול מטמון אם אתה רוצה ליישם איזה מטמון הסוף חזרה לעשות את עבודת היישום מהירה יותר ומה לא. אנחנו צריכים לאפשר את מסד הנתונים ואת מודול ORM, כי כמו שאמרתי, אנחנו משתמשים במסד הנתונים, כמובן, ואנחנו גם צריכים לאפשר את המודול ORM, כי אנחנו רוצים להיות פונקציונליות נוספים, וזה נחמד שיש. כל מה שאני צריך לעשות זה uncomment 2 הקווים האלה, ועכשיו אם אני לרענן, זה נתן לי שגיאה אחרת. הוא אומר, "כיתת Model_Post לא נמצא." עכשיו מדובר בבעיה טובה שיש. בואו נראה. להפוך אותו לציבורי. מס 'חכה. הו, יקירים. אני לא יודע למה זה לא הצליח למצוא את זה. זה באמת מוזר. יש לי בכיתה זה ממש כאן. אני מניח שאולי יש לך - הו. אני כל כך מטומטם. שכחתי להוסיף תג PHP. זה למה. עכשיו אני צריך לבטל, כי השינוי של 1 אני פשוט עשיתי. אוקיי. הנה. זה היה ממש טיפשי. לא היו לי תג PHP פתיחה. אבל כפי שאתה יכול לראות, עכשיו זה עובד כמו שצריך, נכון? יש לנו הודעה 1. אנחנו תפסתי את ההודעה הראשונה, ועכשיו אנחנו הדפסנו הגוף שלה. גדול. פנטסטי. כל שאלות עד כה? לא ולא? כל שאלה? אוקיי, אז אנחנו פשוט יצרנו את פרסום המודל, מאוד בסיסיות, ואנחנו הולכים להוסיף כמה פונקציות בהמשך. אנחנו יכולים להוסיף אימותים וסינון. אימותים הן אחד הדברים שמסגרות לפתור בשבילך ממש ממש טובה, ואני לא חושב שהיה לך חבר 'ה לעשות את זה בשביל pset CS50 שלך, אבל אם אתה עושה את פיתוח אינטרנט במסגרת פרויקט הגמר שלך, אתה כנראה הולך רוצה לעשות איזשהו אימות, כמו שלא שמות משתמש ריקים, אולי יש לו את הסיסמה עם לפחות כמה אורך, דברים כאלה. וזה באמת מסורבל כדי ליישם את הדברים האלה בעצמנו, ופחות או יותר כל אחד ואינטרנט מסגרת עושה את זה בשבילך ומאפשר לך לעשות את זה בצורה מאוד נקייה. והמודל שבו אתה בדרך כלל להביע את כללי אימות אלה, כי זה מאמת אם מודל הוא תקף או לא. אבל לעת עתה, אנחנו הולכים לשים את זה למועד מאוחר יותר, ועכשיו אנחנו הולכים לעבוד על חלק אחר, ואנחנו הולכים לנסות ולעשות תצוגה חדשה המפרט את כל ההודעות. השלבים כרוכים בביצוע פעולה חדשה לרשימה של כל ההודעות הוא לתפוס רשימה של כל ההודעות ולאחר מכן להפוך את הרשימה של כל ההודעות שנכתבו על דרך נוף. כאן, למרבה המזל מספיק, אנחנו כבר תפסו את כל ההודעות שימוש בקו ראשון, למצוא את כל הפונקציה, ועכשיו מה שאנחנו הולכים לעשות הוא כל כך רחוק אני כבר הכנתי את הגוף של התגובה ישירה על ידי העברת החוט, אבל עכשיו אני רוצה להשתמש בתצוגה, ואת ההבדל בין מבט ופשוט עושה את זה הוא עם נוף שאני יכול לקבל תבנית יפה, גדולה ב-HTML, ומה אני יכול לעשות הוא להעביר אותו משתנים מסוימים ולאחר מכן יש את התצוגה באופן אוטומטי לאכלס תבניתה שימוש במשתנים אלה. מה אני אעשה הוא אני ליצור תצוגה חדשה, ואני שם את תצוגת משהו כמו "בלוג / מדד" ואני הולך בעצם להיקשר זה - אוי, מה אני כותב? המוח שלי הוא במקום אחר. אני הולך לקשור את ההודעות משתנים לתצוגה, כך שהדרך יש הנוף לגישה להודעה משתנה זה. ואז עכשיו אני צריך ליצור השקפה זו, אז הנה יש לנו תיקייה זו נקראת "צפיות" וראשון, אני הולך ליצור תיקייה חדשה תחת שנקרא "בלוג". זה נחמד. בדרך זו אנחנו יכולים להיות היררכיה נחמדה לדעותינו. ולאחר מכן אני הולך ליצור קובץ אחר שביש בשם "index.php". מדהים. בעצם, בואו נעיף את שניהם כאן. מה שהופך את קובץ תצוגה הוא כנראה החלק הפשוט ביותר של כל זה, ואלה הם ככל הנראה דברים שאתה כבר מכיר. אנחנו הולכים לעשות משהו ממש פשוט, תתחיל לומר, "רשימה שנכתב בבלוג שלי." אז אנחנו יכולים לעבור, ואנחנו יכולים לחזר דרך מערך הודעות, לתפוס כל הודעה ואומר משהו כמו - אולי להוסיף קו ולאחר מכן להדפיס את המחבר ואת הגוף. זה הגיוני עד כה? ובואו נראה אם ​​זה עובד. שום דבר לא קרה. אני תוהה למה. אוי, התגעגעתי שלב 1. מאוד טיפשי שלי. אני יצרתי את נוף, אבל לא להגדיר את התצוגה כתגובה, כך שאתה צריך לעשות 1 עוד דבר. אתה צריך לעשות "גוף תגובה זו" ולהגדיר אותו כתצוגה. הנה. יש לנו הכותרת שלנו, ואז יש לנו הודעה, וסתם בשביל הכיף, בואו יוסיפו עוד לכתוב כדי שנוכל לראות את רשימה. והכנס את 2 ההודעות הללו, ועכשיו אם אני לרענן את הדף, אנו רואים את כל ההודעות האלה כאן. האם זה הגיוני עד כה? כן, שאלה? אה, בסדר. כפי שניתן לראות, שהצלחנו להפריד את כל הקודים האלה החוצה למקטעים שונים, ואז אתה יכול לראות את זה ברור ביותר עם קוד התצוגה. קובץ זה כאן, המייצג את הנוף, זה רק דואג לייצוג נתונים, הצגת נתונים. שזה יעבור איזה נתונים, וכל שהיא עושה היא פשוט מראה לך את זה. בכל החלקים האחרים של הקוד שלך, אתה לא צריך לדאוג כל כך, ובאופן דומה, קוד המבט שלך לא צריך לדאוג שום דבר על איך לגשת אל מסד הנתונים וכן הלאה וכן הלאה, וזה באמת טוב ועושה את הקוד שלך הרבה יותר לתחזוקה. כמו שאמרתי, תצוגות, הם דינמיים שב זה קובץ 1, אבל זה היה ליצור תצוגות שונות המבוסס על המשתנים שאתה בעצם עובר ב, ויתר על כן, יש הרבה פונקציות עזר שונות כי אתה יכול להשתמש בו כדי לעזור לך לכתוב את הקוד שלך מהר יותר, שאני אראה לך בדיוק שני. כן. [סטודנטים] אז 0 $ הוא בקר, נכון? זה דבר שני. השאלה היא היא 0 $ הבקר? 0 $ הוא משתנה שיצרתי כאן. אני יצרתי את תצוגה ראשונה. אני הטלתי אותו לכמה משתנה. ואז העברתי אותו לתפקיד הזה, להגדיר אותו כגוף של התגובה. האם זה הגיוני? [סטודנטים] אז דעה :: מפעל, היא תצוגה כמו בכיתה או פונקצית מפעל [לא ברור] בספרייה? השאלה היא על פונקצית תצוגה :: מפעל, ובעצם זה הוא חלק תכנות מונחה עצמים יותר במהותו. צפה בהוא ברמת התצוגה, ויש לה שיטה הנקראת "מפעל" וזה דרך כדי לתפוס את האובייקט ששם "בלוג / אינדקס." וזה עוד כמה דברים בתכנות מונחה עצמים שאני לא הולך להיכנס לכאן יותר מדי. עכשיו ברור, אנחנו רוצים ליצור הודעות חדשות, אבל אנחנו לא רוצים לעשות את זה דרך מסד נתונים, כך אנחנו הולכים ליצור פעולה חדשה ליצירת הודעה חדשה, ויש הרבה דברים שאנחנו צריכים לעשות. הדבר הראשון שאנחנו הולכים לעשות - בואו להתמודד עם הדברים האלה אחד אחד. הדבר הראשון שנעשינו הוא שיש לנו כדי ליצור טופס להוספת הודעה חדשה, אבל אני גם הולך להוסיף פעולה חדשה ראשונה, לכן הוספת פעולה חדשה היא פשוט קלה כמו הוספת פונקציה חדשה עם בקר שלך, ועכשיו אני הולך לעשות משהו מאוד בסיסי, פשוט לתפוס את ההשקפה זו ולפרסם אותו, רק להציג את זה בשבילך. ואז עכשיו אני הולך ליצור קובץ תצוגה חדש, ואני הולך להתחיל לכתוב כמה דברים. מה שיפה קוהנה הוא שהם מספקים הרבה פונקציות עזר שונות לך לכתוב קוד תצוגה בקלות רבה יותר, ו1 של פונקציות עזר אלו או מודולים עוזר הוא סביב כתיבת טפסים. לכתיבת טפסים, אני לא באמת צריך לכתוב ישירות כל ה-HTML בעצמי. אתם כתבו טפסי HTML. אתה יודע איך זה יכול להיות ממש ממש כואב ומסורבל לכתוב טפסים. זה לא כיף, אז למרבה המזל, אנחנו יכולים בעצם לכתוב טופס באמצעות קוהנה של ליצור פונקציות עוזר לעשות את זה בשבילנו. אנחנו הולכים להיות בעצם שדות לכל דבר ודבר שיש לנו, כל כך אחד למחברים ואחד לגופים. אנחנו הולכים יש תווית, ואנחנו הולכים להיות קלט. ולבסוף, אנחנו הולכים להיות הגשה. וכמו שאתה יכול לראות, זה הרבה יותר נקי לכתוב יותר מכל, כי ה-HTML המבולגן, שהוא סוג של נחמד. אמנם, יש אינטרנט במסגרות אחרות שיש להם את זה אפילו נקי יותר מזה, אבל לפחות זה יותר טוב מאשר לכתוב את ה-HTML בעצמך. מדהים, אז זה מה שאתה רואה. זה סוג של מבולגן, אז אני הולך להוסיף מעבר שורה יש כדי לגרום לזה להיראות קצת יותר נחמד. ובכן, כמובן, זה עדיין נראה ממש, ממש רע, אבל אנחנו פשוט התמקדנו על פונקציונלי לחברה ולא על האסתטיקה. אין זמן לעשות הכל. וכפי שאתם יכולים לראות, עכשיו יש לנו צורת סופר בסיסית, שהוא סוג של נחמד. קוד זה הייתי אומר שהוא נקי יותר ממנסה לכתוב HTML יוצר בעצמך, אז זה נחמד. מה הלאה? עכשיו אנחנו צריכים לעשות דברים בפעולה. בדרך כלל כשאתה כותב טפסים ב-HTML, אתה צריך להגיד לו לאן זה הולך לשלוח את הטופס ל. כברירת מחדל ברוב מסגרות אינטרנט, היא מגישה לאת הכתובת המדויקת, ולכן הדבר הוא, אם אתה שולח בקשה לגט / בלוג / חדש, זה אמור להציג לך את הצורה, אבל אם אתה שולח הודעה בקשה ל/ בלוג / חדש עם נתונים, זה בעצם צריך לנסות להציל את ההודעה כי ולעשות עם זה משהו. מה שאנחנו הולכים לעשות הוא בעצם כל מה שאנחנו צריכים לעשות כדי לבדוק אם זה פוסט בקשה או בקשת גט הוא לבדוק מה הם משתני ההודעה אתה יכול להגדיר. ואם ההודעה משתנה מוגדר, אז אנחנו הולכים לנסות וליצור הודעה חדשה. שוב, אנחנו פשוט עושים את זה, ושיוצר הודעה חדשה, ואנחנו ממש הולכים להגדיר שדות שלו כמו זה, ואז אנחנו הולכים לשמור אותו. ולאחר מכן אני הולך להפנות לדף האינדקס, כך שניתן לראות הרשימה של הודעות שלנו שוב. בואו ננסה את זה. אני אומר, "ברנדון," ולאחר מכן להגיש את ההודעה, ואם הכל ילך כשורה, כפי שאתה יכול לראות, זה מנותב אותי לדף האינדקס, ואם אני לגלול לתחתית, יש לנו הודעה חדשה שנוספה. יש! כן, שאלה. [סטודנטים] מה אם אתה נכנס בדיוק אותו דבר אתה נכנס קודם? האם זה לבדוק כדי לוודא שאתה לא תשוכפל באותה ההגשה? להיות ברירת מחדל, לא, כי כברירת מחדל - מצטער, השאלה היא אם אתה נכנסת בדיוק באותם נתונים בצורה ולהגיש את זה, האם זה יאפשר לך להוסיף אובייקט כפול, לשכפל כניסה, בעצם? נכון לעכשיו, כן, זה יאפשר לך לעשות את זה, כי במסדי נתונים זה חוקי לחלוטין שיש שורות כפולות לחלוטין, אבל אם זה חשש, אז אתה יכול להוסיף אימותים, למשל, כדי לוודא שאם זה בדיוק אותו הדבר כמו משהו שכבר קיים, אז אומר שזה אובייקט לא חוקי, ואז אתה יכול גם לציין את הודעת השגיאה שלך ואומר, "לא חוקי משום שזה כבר קיים", או משהו כזה. אבל במקרה הזה, אני יכול רק ליצור משהו כפול. עכשיו בואו ננסה ולהוסיף כמה אימותים. הבעיה עם זה כרגע היא ש פשוטו כמשמעו, אני יכול להגיש הודעה ריקה לחלוטין. אני יכול ללחוץ על הכפתור הזה עכשיו, ושם אנחנו הולכים. אתה לא באמת יכול לראות את זה, אבל קו נוסף זה כאן מציין כי אני ממש צריך הודעה חדשה. זה פשוט יש לו מחבר ריק וגוף ריק, ואנחנו לא רוצים לאפשר לאנשים לעשות את זה. זה מקום שבי האימות נכנס אני יכול ללכת לאובייקט המודל שלי, ועכשיו אני יכול להוסיף פונקציה חדשה המציינת מה אימות כללים אני צריך להוסיף למודל זה כדי לוודא שזה חוקי או כדי לציין מה זה אומר להיות הודעה ברה תוקף? ואני רוצה להגיד שזה רק הודעה ברה תוקף אם שני הסופר וגוף אינם ריקים, וזה איך אתה עושה את זה בקוהנה. אתה יוצר פונקציה חדשה בשם "חוקים" ואז אתה בעצם להחזיר מערך אסוציאטיבי המגדיר את כללי אימות עבור אובייקט זה. אנחנו הולכים כדי להחזיר את המערך, ואז מה שאנחנו הולכים לעשות הוא לומר "מחבר," זה הולך למערך, אשר הולך למערך נוסף בשם "לא ריק". ולאחר מכן אני הולך לומר "גוף". אוקיי, ותחביר לזו ומבנה לכך אולי נראה קצת מסורבל וקצת מסובך. אם תקראו את התיעוד, זה די פשוט להבין, אבל בעצם זה מה שאתה צריך לעשות כדי לציין כמה כללי אימות, ויש הרבה חוקים השונים שקוהנה תיתן לך בחינם, כמו שאתה יכול להוסיף כללים לומר זה חייב להיות לפחות באורך הזה. אולי זה צריך להיות מספרי. אולי זה צריך להיות אלפא נומרי. אולי זה צריך להיות לכל היותר באורך זה, וכך הלאה וכך הלאה. ישנם הרבה כללים שונים שקוהנה מספקת בשבילך, ואתה יכול ללכת על אתר האינטרנט שלהם, מסתכל על התיעוד, ואתה יכול לראות את כל דברים השונים שאתה יכול לעשות. אבל זה כל מה שאני צריך לעשות, ועכשיו בואו נראה מה קורה אם אני מגיש את הודעה ריקה. מה הולך לקרות? הו, לא, אני מקבל הודעת שגיאה. אני מקבל חריג אימות. ובכן, זה טוב. זה אמר לי שהמודל שלי הוא לא חוקי, אבל אני לא רוצה להציג את יוצא מן הכלל למשתמשים שלי כשהם מנסים להגיש משהו לא חוקי, נכון? אני רוצה לתת להם איזה הודעת שגיאה ידידותית יותר כאשר משהו משתבש. מה שאנחנו הולכים לעשות הוא שאנחנו הולכים לעטוף את הכל בלולאה לתפוס לנסות. למעשה, אני חושב שזה גם משהו שאתה לא למדת עדיין בCS50, כי C, שפת תכנות C, אין יוצאים מן הכלל, אבל כמעט כל שפה אחרת יש יוצאים מן הכלל, כך שבאמת, באמת בקצרה, יוצא מן הכלל הוא משהו שפיסת הקוד יכולה לזרוק חריג כאשר משהו משתבש, אבל אז אולי קצת פיסת הקוד אחרת גבוהה יותר יכול לתפוס את החריג ושלעשות עם זה משהו. לדוגמא, במקרה זה, קטע קוד שמנסה להציל את מודל, זה מאמת את המודל, ואם הוא אומר, "אוקיי, מודל זה הוא לא חוקי", זה הולך לזרוק את היוצא מן הכלל, וזה סוג של שווה ערך ל ב-C אתה יכול להחזיר -1 או משהו כזה. ולאחר מכן בשבילי, בפונקציה זו, הקוד שלי ברמה גבוהה יותר, אני יכול לנסות ולתפוס את החריג ש ובעצם אומר, "בסדר, אם אני תופס את היוצא מן הכלל, מה אני הולך לעשות?" או שאני יכול לבחור שלא נתפוס את החריג ושלתת למישהו גבוה יותר לתפוס את היוצא מן הכלל, או אם אף אחד לא תופס אותו, אז כל תכנית קורסת ואומרת, "משהו השתבש, ואני לא יכול להתמודד עם זה." אבל מה שאנחנו עושים הוא שאתה עוטף את פיסת הקוד בבלוק try, ואז אתה גם להוסיף משהו שנקרא לתפוס לחסום, שהוא הסוג של קוד שינסה לתפוס את החריגים שעלולים להתרחש. ולכן אם אני תופס את החריג המסוים הזה או חריג פסילה, אז מה אני הולך לעשות הוא אני הולך להגדיר את הטעויות - אני חושב שזה איך אני עושה את זה - ואני הולך להגדיר את השגיאות לאובייקט כלשהו. ואז מה שאני הולך לעשות הוא אם הוא פוגע חריג זה, זה לא הולך לניתוב מחדש, ואם זה לא להפנות, זה הולך לצאת מאם הבלוג והכה את הבלוג הזה / חדש, שרוצה שאני רוצה לעשות. אם יש שגיאה, אז אני רוצה לחזור לטופס ולהציג שגיאות אלו. עכשיו מה שאני רוצה לעשות הוא שאני רוצה לעבור לשגיאות אלה לתצוגה. אוקיי, אני חושב שיש לי את הנוף כאן, ובעצם אני רוצה להציג השגיאות האלה אם הם קיימים. לפני שאני כותב את ה-HTML בשביל זה, אני הולך באמת למהירות להראות לך מה המבנה של זה שגיאות מבטים משתנים אוהבים, וזה תרגול טוב באופן כללי. הרבה פעמים אתה מקבל משהו בחזרה מכל שיטה, כמה פונקציה במסגרת האינטרנט, ואתה לא יודע מה שנראה כמו משתנה, אז אתה לא יודע איך לעבוד עם זה. אני הולך להשתמש בשיטת r הדפסה בעצם להדפיס אותו. וכמו שאתה יכול לראות, זה אומר לי שזה מערך לקשר, ויש לך מפתח, מחבר, נקודות למחרוזת זו, המחבר אינו יכול להיות ריק, ועוד מפתח, גוף, נקודות לעוד מחרוזת, גוף אינו יכולות להיות ריקות. אני, כאילו, בסדר, מגניב. אז אני יכול לחזר באמצעות המערך ולהדפיס את כל הודעה בודדת. זה בעצם כמו מערך אסוציאטיבי עם חבורה של הודעות. מה שאני הולך לעשות הוא "אם שגיאות," ואני הולך ליצור רשימה לא מסודרת, ואני הולך לחזר דרך כל השגיאות. ואת זה, ועכשיו אני הולך לנסות לשלוח את זה שוב, ובואו נראה מה שאנחנו מקבלים. עכשיו אנחנו מקבלים רשימה נחמדה של טעויות, וזה עדיין די מכוער, אבל זה כמובן יכול להיות מעוצב כדי להיראות יפה, אבל הרעיון הבסיסי הוא פשוט בכמה שורות של קוד, היינו יכול לאמת את המודל שלנו, לוודא שתחומים מסוימים לא היו ריקים, ואם משהו ישתבש, ואז לחזור איזה הודעת שגיאה אז אני יכול להציג בחזרה למשתמש. ניתן גם להתאים אישית האימות שלך כך שאתה יכול למעשה יש הודעת שגיאה כי הוא יותר ספציפי ליישום או משהו כזה שלך. כל מה שהוא בדרך כלל להתאמה אישית. לרוע המזל, אנחנו הולכים ואוזל זמן, אז אני הולך לצריך לנתק את מושב הקידוד לחיות כאן. יש חבורה של תכונות אחרות שאני רוצה להראות לך בדוגמא זו. לדוגמא, אתה יכול להוסיף תבניות לאתר שלך, אז אולי יש איזה סוג של קוד ה-HTML שברצונך להחיל לכל דף באתר שלך, ובמקום שהדבקה בכל קובץ תצוגה יש לך, שללא ספק יהיה מנהג רע, בעצם אתה יכול להגדיר תבניות אלה, ולאחר מכן בבקר שלך אומר, "אוקיי, אני משתמש בתבנית זו." "האם כל דעותיי להשתמש בתבנית זו." והדבר האחרון שאני רוצה להראות לך גם כן כי אין לנו זמן להוא Scripting בין האתרים, ובעצם אני חושב שחבר 'ה שראה כנראה בCS50 - אני חושב שהדוד מלאן כנראה דיבר על איך אתה בדרך כלל יכול להזריק קוד JavaScript ל-- יש לך דיבר על זה? אולי? אולי לא? אבל הרבה פעמים אתה יכול להזריק קוד JavaScript זדוני לתוך מסד הנתונים של מישהו, ואם הם לא לברוח כמו שצריכים, לאחר מכן, כאשר הם מציגים נתונים שבחזרה למשתמש, אז זה יכול להפעיל איזשהו קוד JavaScript האקראי אתה לא רוצה שקורה, ואני הולך להפגין איך אתה הייתי עושה את זה בתוך קוהנה. זה בעצם ממש ממש קל. אני יכול לעשות את זה עכשיו ב2 שניות, פשוטו כמשמעו. כל מה שאתה צריך לעשות זה בעצם לעטוף את הדברים האלה בדבר הזה שנקרא ישויות HTML. וזה יהיה באופן אוטומטי לברוח כל הדמויות כראוי וודא שאתה לא מקבל את הבעיה הזו. [סטודנטים] אתה כוסמין המבחן הראשון באופן שגוי. [ברנדון ליו] אה, אופס. אוקיי, זה כל מה שהיה לי לחלוק איתכם להיום. שקופיות אלה הולכים להתפרסם, אבל אלה הם בדרך כלל המשאבים היחידים שאתה צריך באמת צריך כדי להתחיל עם קוהנה. אתה יכול ללכת לאתר האינטרנט. יש להם מדריך למשתמש, ויש להם גם חוקר ה-API. אנחנו יכולים לחקור את כל הפונקציות שונות ופונקציות עזר יש להם בשבילך. בדרך כלל יש להם מספיק מידע באתר כי אתה יכול להשתמש בו כדי להתחיל ולקבל הולך עם קוהנה. אין הדרכות כי רבות, אני חושב, לקוהנה, מחוץ מה יש להם באתר כאן, אז זה כנראה ההימור הטוב ביותר שלך. אבל אם אתה רוצה ללכת למסגרת האינטרנט ואתה לא רוצה צריך להרים את שפה חדשה, ואתה רוצה משהו שהוא יחסית קל משקל ויש לו עקומה למידה קלה, אני בהחלט הייתי מציע קוהנה. זאת כנראה ההצעה הטובה ביותר לכך. הדבר המצחיק, אם כי, הוא אם אנחנו היו באמצעות Ruby on Rails, היינו יכול לשכפל את מה שאנחנו פשוט עשו וכנראה יותר בתחת 3 דקות. לא בדיחה, אבל לומד Ruby on Rails לוקחת הרבה יותר זמן ממה שהוא היה לוקח ללמוד קוהנה. זה בעצם הבחירה שלך על מה שאתה רוצה לבחור ללמוד, אבל אם אתה רוצה להתחיל לעבוד במהירות, קוהנה היא בהחלט בחירה טובה מאוד. כל שאלות האחרונות לפני שנסיים? כן. [סטודנטים] איך היינו לשלב כי במסגרת CSS כמו שהיית באמצעות כשהיית מורה? השאלה היא איך היינו לשלב את זה עם מסגרת CSS? מה שאנחנו כנראה עושים זה כנראה יכלול תיקייה חדשה שבו היינו לזרוק את כל קבצי CSS שלנו, ואז היינו גם להוסיף תבנית חדשה. בתבנית שהיינו כולל קבצי CSS אלה כדי לוודא שהם מפנה בכל עמוד אחד, ולאחר מכן כאשר אתה בעצם כותב HTML, אתה פשוט להוסיף כיתות ומה לא מתאימות, ולדוגמה, כאשר אתה משתמש במשהו כמו הטופס פונקציה עוזר, אתה יכול להוסיף עוד פרמטרים אחר כך כדי לציין מה שיעורים אתה רוצה להיות מחובר לדברים שונים כדי שנוכל לעצב אותו כמו שצריך, וזה בעצם איך היית הולך. יש עוד שאלות? מדהים. תודה לך על הזמן שלך, ותודה שבאת. אני לא הולך להוסיף הרבה מאוד אחר, אבל 1 דבר ממש מהיר הוא שאין לנו קישור לטופס. באמת מטומטם. בואו נוסיף - למעשה בתצוגה, בלוג, אינדקס, בואו באמת במהירות להוסיף קישור שהולך לדף החדש, הדף שבו אנחנו יכולים להוסיף הודעה חדשה. אנחנו הולכים לעשות את זה. מה שיפה הוא שיש קבוצה שלמה של פונקציות עוזר HTML שעושים דברים שונים עבורך, כך שאתה כבר ראית את הגופים לתפקד כאן, אבל יש להם גם פונקציה שנקראת "עוגן" שבו אתה יכול להקליד בבלוג / חדש ואומר, "פוסט בבלוג חדש". וזה יהיה ליצור קישור זה בשבילך, וזה נראה באמת טריוויאלי לעשות, אבל זה נחמד, כי נניח שאתה מעביר את האתר שלך מתחום של 1 למשנו. ואם אתה רק כתבתי את כתובות האתר בעצמך, אז היית צריך לשנות את כל כתובות האתרים. או שאולי אתה עבר אותו מתיקיית המשנה 1 למשנה אחרת. היית צריך לשנות את כל כתובות אתרים אלה בעצמך, וזה לא כיף. אתה יכול להשתמש בעוגן זה ממש כאן, ואתה יכול לשנות את התחום או את קידומת תיקיית משנה בקובץ התצורה פעם אחת, ואז זה יהיה להחיל את זה בכל מקום, וזה, שוב, דוגמה מצוינת לא לחזור על עצמך, ייבוש הקוד שלך החוצה. בכל מקום שאתה חוזר על עצמך, לנסות ולחלץ בסוג כלשהו של קובץ תצורה או לתפקיד שונה ויש לו להתמודד עם זה בשבילך. והדבר האחרון שאני רוצה להראות לך היה מניח שחזרנו בפוסט הזה, ואני הלחנתי כמה מאמר באמת ארוך, אבל שכחתי לכלול המחבר שלי. כעת, כאשר אני לוחץ על "שלח הודעה" אני פשוט איבדתי את הכל. לא! באמת עצוב. אז איך אתם מתמודדים עם זה? זה מה שאנחנו עושים. מה שאנחנו עושים כאן לפונקציות אזור טקסט קלט ואלה, אם תכללו את פרמטר שני, ולאחר מכן ערך שהפרמטר השני הולך להיות מה שהתחום הולך להיות מאוכלס בתחילה. מה שאנחנו יכולים לעשות הוא בבקר בבלוג שלנו, אנחנו יכולים להיקשר משתנה אחרת. קורא לזה "ערכים" אולי. ולהעביר בהודעת המערך, פשוטו כמשמעו. זה אומר שאם האימות נכשלה, עובר לי בהודעה המערך שהגשתי מהבקשה האחרונה, וככה אני יכול להשתמש בערכים מההגשה האחרונה שלי כדי לאכלס מחדש את השדות. עכשיו אני יכול לעשות משהו כזה מחבר ערכים וערכים בגוף, וככה עכשיו אם אני עושה כמה דברים אקראיים ולחץ על "שלח הודעה", ואז הוא נשאר שם. אבל אנחנו הולכים לרוץ לתוך בעיה נוספת. זה עובד, אבל אם אני הולך לדף בפעם הראשונה, זה הולך לקרוס, וזה בגלל שהפעם הראשונה אנחנו הולכים לדף, הודעה משתנה זה לא הוגדר עדיין. זה ריק. זה לא קיים. ומה שאנחנו רוצים לומר הוא שאם המפתח הזה קיים, לאחר מכן להחזיר את הערך של מערך זה, אבל אם המפתח אינו קיים, ולאחר מכן להחזיר מחרוזת ריקה. זה פונקציונלי שאנחנו רוצים כאן. אנחנו רוצים לבדוק אם המפתח קיים לפני שאתה מנסה לגשת למערך, ולמרבה המזל מספיק, קוהנה גם נותנת לנו פונקציה עוזר לכך. יש להם חבילה שלמה של פונקציות תחת השם ARR, קיצור של מערך, ויש להם פונקציה 1 בשם "מקבל", ואתה יכול לעבור במערך, ואתה יכול להעביר בשמו של המפתח. אז בעצם מה זה יעשה זה ינסה להשיג את המפתח הזה, אבל אם מפתח שאינו קיים במערך, לאחר מכן הוא יחזור ריק, או שאנחנו יכולים גם לציין ברירת מחדל, אני מאמין, וזה נחמד. עכשיו, אם אנחנו עושים את אותו הדבר שוב, אז אתה רואה עכשיו זה עובד בפעם הראשונה, ושוב, אם אנחנו מקלידים כמה דברים אקראיים ולנסות ולהגיש, אז הוא נשאר שם. ואני מניח שאני יכול גם להראות לך כיצד להוסיף תבנית ממש מהר. מה אנחנו יכולים לעשות ראשון הוא שאנחנו יכולים להוסיף תצוגה חדשה בשם "template.php" בתוך תיקיית צפיות, ומה שאני הולך לעשות הוא אני הולך להדפיס משהו שנקרא "תוכן" שהוא הולך להיות התוכן העיקרי שלי. ואולי בתחתית מאוד אני הולך להוסיף, למשל, זכויות יוצרים. [שאלת תלמיד לא נשמעה] [ברנדון ליו] אולי זו תבנית העל בסיסית אני רוצה להשתמש. אני רוצה שתהיה תיקייה עם זכויות היוצרים שלי על כל דף, ועכשיו מה שאני הולך לעשות בבקר שלי עכשיו במקום לומר, "מרחיב בקר" אני הולך לומר, "מרחיב Controller_Template" ועכשיו במקום לומר, "גוף תגובה שווה להשקפה זו," אני הולך לומר, "תוכן תבנית זו הוא -" ואני חושב - אני יכול לשים סימן שוויון? אני שוכח. כן, כך חשבתי. ועכשיו אני מגדיר שמשתנה תוכן שווה את הנוף. אני יכול לעשות את אותו הדבר כאן. ועכשיו אם אני לרענן, אתה יכול לראות עכשיו זכויות יוצרים זה מתווסף לשם, ופשוט לעשות קצת פוסט אקראי, ואז, שוב, אתה צריך לראות שזכויות היוצרים היא בתחתית הדף. גדול. זה כל מה שרציתי להראות לכם חבר 'ה. [מחיאות כפיים] כל שאלה? [CS50.TV]