[השמעת מוסיקה] ERIC אויאנג: היי, כולם. ברוך הבא. זהו בניין דינמי Web Apps עם Laravel. שמי אריק אויאנג. אני בכיתה י 'לומדת מדעי חברה עם שני במדעי מחשב, ואני גר באדמס הבית, כאן בהרווארד. אז Laravel, ברוב הליבה שלה, היא מסגרת יישום האינטרנט MVC. אז אוהב את מה שיש לך חבר ' כבר עושה עם CS50 האוצר, Laravel היא מסגרת המאפשרת לך לבנות יישומי אינטרנט דינמיים. אז אתה יכול לחשוב על זה במובנים מסוימים כשלוחה של הסוג של דברים אתה כבר עושה בCS50 האוצר, אבל מערכת זה חזק הרבה יותר, הרבה יותר אלגנטי במובנים מסוימים, ומספק הרבה פונקציונלי בשבילך לבנות מורכב למדי יישומי אינטרנט. אז בואו לעבור כמה התכונות העיקריות, ואז לצלול לתוך דוגמא לבניית בלוג יישום עם Laravel. אז אחד הדברים הראשונים ש מבדיל אותו מסוג MVC עבודה שאתה כבר עושה עם CS50 זה כולל מנוע ORM. אז ORM עומד לאובייקט מיפוי יחסי. אז זה מאפשר לך לבנות שכבת הפשטה בין בסיס הנתונים ובקרים שלך. כך שלא כמו בCS50 האוצר שבי שלך ישירות לעשות שאילתות, שכבת ORM מאפשרת לך מופשט שממנו וליצור דגמים שהם יותר חזקים מ אתה יכול ישירות עם שאילתות SQL. דבר נוסף שבאמת מועיל הוא תבניות להעברה בירושה. אז תוכל להבחין בCS50 האוצר, אתה בסופו שכתוב הרבה דברים, שבו מקומות שאתה עלול שימוש חוזר בדברים, אתה לא מסוגל. אז הנה בLaravel, אתה יכול להשתמש במה שהוא ידוע כמנוע תבנית הלהב כדי ליצור פריסת אדון. ומשם, אתה יכול לרשת כך שמשנת תבניות בעצם יכולה כולל אלמנטים בתוך שתבנית בסיס גדולה יותר. הגירה. אז זה תכונות סטנדרטי למדי ב רוב מסגרות יישום האינטרנט מודרניות. אז זה מאפשר לך לייצג שינויי סכימת מסד נתונים בקוד. אז בלי הולך להגיד, phpMyAdmin, למעשה אתה יכול ליצור הגירות אלה שבו אתה מייצג את בסיס הנתונים סכימת שינויים בקוד ישירות. וזה מאפשר לך to-- במיוחד אם יש לך מספר רב של אנשים שעובדים באותו application-- האינטרנט לעקוב אחר שינויים אלה, אומר בGitHub, או כמה מאגר אחר. אז זה באמת מועיל וממתן את הצורך ל, למשל, מעביר הרבה מזבלות של SQL. ולבסוף, מלחין הוא משהו באמת, באמת שימושי המאפשר לך להשתמש אחרים הקוד של אנשים לעשות דברים מדהים. אז Laravel של מובנה כ כמה חבילות מלחין. אז אומר שאם אתה רוצה להביא בחבילת אימות או אם אתה רוצה להביא כמה סוג של גנרטור תסריט או מנהל ממשק, אתה יכול לחבר ולשחק אלה רכיבים עם מלחין. אז בואו נתחיל. כל שאלות ממך בחורים לפני שנתחיל? אין שאלות? מגניב. אז הצעד הראשון הוא התקנת מלחין. אז מלחין מאפשר לך לנהל יחסי תלות אלה, בין אם זה במסגרת Laravel או כמה סיומת אחרת של צד שלישי. הפקודה הראשונה מאפשרת לך להוריד מלחין, והפקודה השנייה מאפשרת לך להעביר אותו לתיקיית bin המקומית שלך כך שאתה יכול לרוץ מלחין ישירות דרך המסוף. אחרי זה, קדימה, ליצור פרויקט Laravel חדש. אנחנו בעצם הולכים להשתמש בחלק קוד לדוגמה כי אני כבר להרכיב כדי ליצור את הבלוג הזה. אבל אם אתה מתחיל מ שריטה, עליך להשתמש בפקודה זו עד כאן, מלחין ליצור פרויקט, laravel לקצץ laravel, ולאחר מכן שמו של הפרויקט שלך. ושיכלול כל קוד ההפצה להתחלת פרויקט Laravel חדש. אז לפרויקטי גמר CS50 שלך, כנראה רוצה להשתמש בפקודה ש. אבל אנחנו הולכים להתחיל עם זה. אז ברגע שעשית כי, אתה הולך לקבל מספר נרחב למדי קבצים בblog50. אז בואו רק לעבור חלק ממרכיבים אלה. תוכל להבחין במסלול זה ספרייה, יש תיקיית יישום. בתוך תיקיית היישום, יש כמה תיקיות מועילות. שימו לב להתחיל עם היא תיקיית config זה. אז זה מגדיר את אופן ש יישום האינטרנט שלך הוא הולך, למשל, לאמת או אנשים דברים או במזומן להתחבר למסד הנתונים. ומה באמת מועיל הוא שLaravel מאפשר לך להגדיר שונה סביבות פיתוח. אז מה שעשינו כאן הוא אם אנחנו הולכים תחת התיקייה המקומית, יש קובץ database.php. ותשימו לב שאנחנו כאן להגדיר חיבור MySQL ש מאפשר לאנשים להתחבר לשרת MySQL זה ישירות על מכשיר CS50. ואנחנו מתחברים למסד נתונים שהקמתי בשם Blog50. אז בואו באמת ללכת קדימה ו להפעיל את גרסת העובדת של זה, רק כדי לקבל תחושה של מה ש יישום שאנחנו בונים נראה. אז יש לי עותק של Blog50 זה הושלם. אז בעצם Laravel בנה בשרת שאתה יכול לרוץ ישירות משורת הפקודה. אז זה דומה ל PSet לפני כאשר אתה בעצם לבנות שרת משלך בג אז יש להם אחד שנבנה בכך שאתה יכול להריץ יישומי Laravel שלך ישירות משורת הפקודה. אז אם אנחנו עושים מלאכה php לשרת, זה ישיק שרת פיתוח ביציאה 8000. אז אם אנחנו הולכים למארח מקומי 8,000, תוכל להבחין כי, היי. יש לנו הבלוג והפעלה שלנו. אז Laravel כאן הוא יצירה בעמוד הראשון של הבלוג שלנו. יישום פשוט מאוד. אבל יש כמה תכונות ממש מגניבות שהיא מספקת מתחת למכסה המנוע. אז של יישום הבלוג פשוט. אם אנחנו רוצים ליצור פרסום, אנחנו יכולים ללחוץ על לחצן זה. אנחנו יכולים לומר, "היי, כולם. זה ממש כיף סמינר ", למשל. ולכתוב משהו כאן למטה. טקסט כאן. אם לחץ על שלח, שתצליח שם לב שהבלוג החדש שלנו פוסט נוסף ל העמוד ראשון של הבלוג. אם נחזור לכאן, תוכל להבחין כי היו כמה תגובות כבר בבלוג. אז אם אנחנו לגלול למטה, שתצליחו שם לב שיהונתן טאן אומר שהוא הסתקרן מאוד מהפוסט הזה. אז אנחנו נלך לאיך אובייקט מיפוי יחסי מאפשר לך לעשות יחסים אלה ב דרך די חלקה גם כן. מגניב. כל שאלות על פונקציונלי של מה שאנחנו הולכים לבנות? מגניב. אז בואו נתחיל עם בפועל יצירת טבלאות מסד הנתונים. אז אזכור שבCS50 האוצר, אתה להרכיב שולחן למשתמשים כמו גם ל מניות בתיק ההשקעות שלך. אז כמו שציינו קודם לכן, מה אנו משתמשים בLaravel הוא משהו שנקרא נדידה. אז אם נחזור ל קוד הפצה כאן, הפקודה הראשונה שהיא מועיל שLaravel מספק לך היא הפקודה להגר זה. אז אנחנו יכולים לעשות להגר אומן php: לעשות. אז זה מאפשר לנו ליצור הגירה. ואז אנחנו רוצים כדי ליצור הגירה נקרא create_posts_table, שהוא הולך להיות לאן אנחנו הולכים ל להיות אחסון ההודעות שנכתבו בבלוג שלנו. ותוכל להבחין כאן כי הוא פועל דרך כמה קוד שלמעשה מייצר קובץ עם חותמת זמן על זה. אז אם אנחנו הולכים ומסתכלים על מסד נתונים, אנו שמים לב תחת הגירות שזה יצר קובץ ריק עבורנו ש יש קוד מוכן מראש עם שם שצוינו, ליצור שולחן הודעות. ויש לו שני תפקידים בו. למעלה הוא מה שאנחנו רוצים לפעול בעת ההגירה מוחלת על בסיס הנתונים. ולמטה הוא מה שאנחנו הולכים לעשות כאשר אנו רוצים להפוך הגירה. אז הנה בואו נתחיל מ עם כתיבת הגירה זו. אז יש מעמד מועיל בLaravel נקרא סכימה. אז אנחנו הולכים לרוץ סכימה :: ליצור. ואנחנו הולכים ליצור טבלה בשם הודעות. וכאן אנחנו מיישמים זאת באמצעות פונקציה. ובתוך כאן, אנחנו הולכים בעצם לציין את התוכן של השולחן שלנו. אנחנו הולכים ליצור זהות, אשר הוא אוטומטי הגדלה. בנוסף, אנחנו הולכים כדי ליצור שדה ש מייצג את הכותרת של הפוסט בבלוג שלנו. גם אנחנו הולכים ליצור שדה לאחסון הטקסט של הפוסט בבלוג שלנו. ולבסוף, אנחנו הולכים כדי לאחסן כמה חותמות זמן כאשר הודעתנו נוצרה ומתי זה עודכן. וללמטה, זה די פשוט. כל מה שאנחנו רוצים לעשות הוא ירידה השולחן שיצרנו. גדול. יש שאלות? אז עכשיו אם אנחנו הולכים קדימה and-- למעשה, מארח מקומי, תן לי למחוק את מה שהיה לנו קודם לכן. עבור למאגרי מידע. אני הולך למחוק את מה שהיה לנו קודם לכן. ירידה זו וליצור מסד נתונים חדש Blog50. אז מה עכשיו הקסום חלק כאן כי אנחנו ניתן להחיל הגירות אלה ישירות למסד הנתונים באמצעות שורת הפקודה כלי. אז אם אנחנו עושים להגר אומן php, תוכל להבחין כי, היי. זה יצר את שולחן ההגירה, שאנחנו נסתכל בקצת, וזה מיושם הגירה ראשונה זה. אז אנחנו מסתכלים Blog50, תוכל להבחין שזה יצר שני שולחנות עבורנו. ראשון הוא שולחן הגירה זו. אז אם אנחנו לגלוש זה, תוכל להבחין כי טבלה זו היא פשוטה למדי. זה פשוט אמר ש, היי. אנחנו כבר מיושמים הגירה זו. אנחנו הולכים אחורה ולהסתכל על הודעות. תוכל להבחין כי המבנה זה בדיוק מה ששאלנו אותו. יש לנו תעודת זהות הגדלה אוטומטית. יש לנו מחרוזת לאחסון הכותרת, ושדה טקסט לאחסון התוכן. גדול. מגניב. כל שאלות על הגירות עבודה, איך אנחנו יכולים ליישם אותם? לא? מגניב. אז עכשיו אנחנו הולכים קדימה ובעצם ליצור את המודל. אז אנחנו רוצים ליצור מודל הודעות ש מאחסן הפשטה של ​​מסד הנתונים. אז במקום לעשות שאילתות MySQL ישירות, אנחנו הולכים ליצור. אז אנחנו צריכים ליצור תיקייה בדגמים כאן בשם. ובתוך כאן, אנחנו הולכים ליצור קובץ בשם post.php. בתוך קובץ PHP זה, אנחנו הולכים ליצור לאחר מעמד המשתרע רהוט. הרהוט הוא שמו של ORM מנוע שLaravel מספק. וכאן, היינו מצפה ש אתה באמת צריך לכתוב קצת קוד. אנחנו הולכים לכתוב כמה פונקציות עוזר מאוחר יותר. אבל מחוץ לקופסא, זה כבר יהיה לזהות מה הוא בבסיס הנתונים ואנחנו יכולים לגשת, אומרים, את הטקסט של הפוסט בבלוג שלנו או את הכותרת, וליצור דברים ישירות עם פחות או יותר שאף קוד כלשהו. אז זה אחד מהמרכיבים הקסומים. ורוח פעם אחת זה בכיתה הוא מנוצה באופן מלא יותר, אנחנו כוללים מידע על מה ש זה קשור ל, כך ההערות. גם ליצור פונקציה כך אנחנו יכולים למעשה ישירות לקבל את כתובת האתר של פוסט בבלוג דף. מגניב. כל שאלות על זה? מס ' מגניב. אז עכשיו ברגע שיש לנו המודל שלנו, אנחנו רוצה ליצור בקר זה תוכל להתממשק עם מודלים אלה, ולאחר מכן את מסד הנתונים. אז אם אנחנו נסתכל ב BlogController, שתצליח שם לב שיש לא הרבה כאן עכשיו. כל מה שיש הוא פונקצית מדד שיוצר בדף הבית, אבל בלי שום דבר יש להציג עדיין. אז הפונקציה הראשונה שאנחנו הולכים ליצור הוא אחד המאפשר לנו כדי ליצור פוסט בבלוג. אז אנחנו הולכים להכריז פונקציה חדשה בשם newPost. ובתוך כאן פשוט, אנחנו הולכים כדי להגדיר את הפריסה של דף זה להיות לדקלם גרסה, אם אתה זוכר מCS50, של תבנית זו נקראת blog.new, ש אנחנו הולכים ליצור בקצת. תוכל להבחין כאן בקו שישה ש אנחנו צוינו משתנים זה, פריסה. ואם אנחנו נסתכל בתיקיית הצפיות, יש תיקיית פריסות, ש כולל קובץ HTML בסיסי מאוד. והערה, תוכל להבחין שיש לנו מיכל זה כאן שמניב תוכן. אז בתוך התבנית שלנו מה אנחנו הולכים לעשות הוא יוצר את מה שהולך להיות להחליף ישירות בתוך פריסה זו. אז אמרתי שאנחנו רוצים להבהיר תבנית נקראת blog.new. אבל בתוך הבלוג, יש עדיין לא תבנית חדשה. אז אנחנו הולכים ליצור קובץ בשם new.blade.php. זה אומר שLaravel קובץ זה PHP צריך להיות שניתנו עם מנוע תבנית להב. אז זה די קובץ פשוט. זה הולך להיות בצורה שבי אנחנו בעצם להוסיף בפוסט בבלוג. אז הקסם לכאן מ ירושה היא ש, היי. אנחנו רוצים לציין ש סעיף, סעיף התוכן כאן, שהוא מותווה על ידיsection ו@stop. אז מה שביניהם כאן הולך להחליף לפריסת האדון. והנה מה שאנחנו רוצים לעשות הוא מאוד פשוט ליצור קובץ HTML חדש. בואו פשוט להוסיף כותרת מהירה. הוסף פוסט בבלוג. ובתוך זה, אנחנו הולך ליצור צורה. טופס זה הולך להיות פעולה. וזה הולך להיות משהו שנחליף בהמשך, ואנו רואים כיצד ניתוב משתלב כאן. אבל אנחנו פשוט הולכים להגדיר לעת עתה שזה הולך לכתובת עם המסלול מcreatePost. ואז זה הולך יש פוסט שיטה. בתוך כאן, אנחנו הולכים יש שני שדות. כיתת Div = "טופס-קבוצה". אנו משתמשים בספריית Bootstrap CSS סיפק באדיבות טוויטר. אז אנחנו הולכים ליצור שני אלה. אז קלט ראשון זה הולך להיות הכותרת. אז קלט name = "כותרת". Class = "formcontrol". סוג = "text". אני הולך להוסיף מציין מיקום = "כותרת". ולאחר מכן השני הוא הולך להיות אזור טקסט. שם = "תוכן". Class = "formcontrol". ומציין מיקום = "כתוב כאן". יש לנו ללכת. לבסוף, אנחנו הולכים להוסיף כפתור שליחה מהיר. סוג = "submit" class = "BTN BTN-יסודי". אז כל אלה הם תכונות של Bootstrap כך כי זה יכול להיות מונח בדרך זו טרף למשתמש, ולא HTML עירום. אז יש לנו הגדרתי את הבקר כאן. אנחנו הגדרנו תצוגה פשוטה מאוד. אבל מה שחסר הוא רקמת חיבור. לכן בשלב זה, יש Laravel מושג איך אנחנו הולכים בעצם הגישה בקר זה. אז זה מוגדר ב קובץ בשם routes.php. ועכשיו, יש לנו מסלול אחד. וזה כאשר אנחנו הולכים ל דרך הביתה לאתר זה, זה הולך לדקלם בקר המדד. אז הנה מה שאנחנו צריכים לעשות הוא ליישם מסלול חדש עבורנו כדי ליצור הודעה. אז אנחנו משתמשים בשיטה זו לקבל, אשר מציין כי כאשר משתמש מנסה לקבל את זה page-- במיוחד ההודעה לקצץ page-- החדש מה אנחנו הולכים לעשות הוא משתמש בבקר נקרא פוסט חדש BlogController. אחד שזה עתה יצר. ואז אנחנו הולכים לכינוי זה כnewPost. אנחנו הולכים ליצור עוד פונקציה בקצת. אבל מה כאן תחת המפתח "כמו" זה מה ש אנחנו יכולים להחליף ב תבניות Blade שלנו. אז לעת עתה, בואו למעשה גם אומר מסלול. אז אנחנו הולכים גם כדי ליצור בקר כדי שנוכל ליצור הודעות אלה. אז אם הודעות משתמש פוסט הדף לקצץ חדש, מה שאנחנו הולכים לעשות הוא משתמש בבקר ש אנחנו הולכים ליצור זמן קצר נקרא BlogController בcreatePost. ואנחנו הולכים לכינוי זה עם כcreatePost. מגניב. יש שאלות? מגניב. אז בואו לרוץ מה יש לנו עד כה. אז אם אנחנו עושים מלאכה php לשרת, אנו רואים המון שגיאות. כך זה נראה כאילו יש לנו שגיאת תחביר במסלולי קו 27. אה. חסר פסיק. אז אם אנחנו הולכים ל8,000, תראה כאן שום דבר עדיין. אז זה בדף הבית המוגדר כברירת המחדל. אבל אם אנחנו הולכים לפרסם לקצץ חדשים, היי. זה יהיה בצורה שאנחנו פשוט נוצרו. נכון לעכשיו, יש לנו לא יישם את הפונקציונליות כאשר אנו לוחצים על לחצן שלח. אז אם אנחנו לוחצים על שלח כפתור, זה הולך לרוץ שגיאה. אבל אנחנו הולכים לקוד ש עכשיו, בדיוק מה שאנחנו רוצה לעשות כאשר משתמש מגיש טופס זה. אז בואו נעשה את זה. חזור לקובץ בקרים. מה שאנחנו הולכים לעשות הוא ליישם פונקציה חדשה זו המאפשר לנו ליצור פרסום. להכריז פונקציה חדשה. createPost התפקיד ציבורי. ופונקציה זו הולכת להיות קצת יותר מתוחכמים ממה ש היו לנו קודם. אבל אתה רואה כאן שאנחנו לא הולך בעצם לכתוב כל SQL. ORM, הרהוט ORM, הולך לאפשר לנו לעשות את זה בכמה דרכים דרך אלגנטית יותר. אז אנחנו הולכים ליצור הודעה חדשה. וכאן אנחנו את הפעלת אובייקט חדש מהמודל שאנחנו פשוט נוצר, לאחר המודל. ומה אנחנו הולכים לעשות הוא להגדיר תכונת כותרת של משהו באמצעות זה שאנחנו מקבלים מהשרת. אז זה דומה למה ש היו לנו קודם בCS50 האוצר שבו היינו עושה, באמצעות הסופר גלובל פוסט מחפש כותרת. אז Laravel מספק כמה תברואה ומה לא באמצעות פונקצית עוזר זה. אז אנחנו מעדיפים להשתמש בזה במקום של צורת גלם בסיסית מאוד זה מPHP. ואז מה אנחנו הולכים לעשות הוא להגדיר התוכן שלה לקלט לקבל תוכן. אנחנו בעצם הולכים לעטוף זה בפונקציה מועילה PHP שמספק נקרא nl2br, ש מתברר קווים, NLS, לBRS, הפסקות חדשות, כך שאנחנו באמת יכולים להיות סעיפים שונים בתוכה. ולבסוף מה שאנחנו הולכים לעשות הוא לשמור את הפוסט הזה. אז אנחנו קוראים לפונקציה לשמור על מודל זה. אנחנו הולכים לשמור את ההודעה. ולבסוף מה שאנחנו הולכים לעשות הוא להפנות את המשתמשים באופן ספציפי בתוואי שאנחנו הולכים ליצור זמן קצר, כינוי על ידי viewPost. ואנחנו הולכים לעבור בטיעונים id, להיות id של הודעה חדשה. גדול. אז עכשיו אם אנחנו באמת הולכים ולהפעיל את זה. אנחנו הולכים להוסיף הודעה חדשה. בואו נגיד שזה סמינר 50. ואומר, בטוח. Asdl. לא משנה מה. איזה תוכן. ולהגיש אותו. ואנחנו שמים לב ש, היי. מסלולים אינם מוגדרים. אבל אם אנחנו נסתכל בphpMyAdmin ו לחפש או לא הפונקציה שלנו לא עשה כלום. תסתכל על הודעות Blog50. אנחנו שמים לב ש, היי. למעשה, אנחנו לא רק ליצור בלוג ש לפרסם עם חותמות הזמן כמפורט. אז עכשיו בואו נחזור וליצור למעשה פונקציה אחרת זה בבקר שלנו, במיוחד בקר viewPost. viewPost פונקציה אז ציבור. אז הנה מה שנעשינו, במקום שיש סוגריים ריקים, אנחנו רוצים לעבור בתעודת הזהות של לאחר שאנו יוצרים. ומכאן מה שאנחנו הולכים לעשות למעשה שאילתת מסד נתונים על זה. אז אם אנחנו יכולים לשלוח הודעה, יש פונקציה שנקראת מצא המאפשר לנו לבצע שאילתא זה לפי תעודת זהות. באופן ספציפי, בעצם, אנחנו הולכים משתמש בגרסה חלופית של הזה שנקראת מצא או Fail, אשר מאפשר לנו כדי לצאת מפונקציה זו, לזרוק חריג אם ID אנחנו עוברים באינו קיימים. ואז אנחנו הולכים לעשות משהו בדומה למה שעשינו קודם לכן שבו אנו קובעים את התוכן דף זה כדי להיות הגרסה שניתנו מבט החדש שאנחנו הולכים ליצור, blog.view. ואנחנו הולכים לעבור ל it-- בדיוק כמו בCS50 לדקלם function-- מילון של משתנים. המפתחות של מערך אסוציאטיבי זה הפך משתנים בתוך התבנית. אז אנחנו הולכים לעשות פוסט פוסט. אז עובר בעקיפין ההודעה ש אנחנו כבר שאילתא מבסיס הנתונים. . עכשיו מה שאנחנו הולכים ל לעשות הוא ליצור השקפה זו כך שלמעשה אנו יכולים להציג הרשום בבלוג שבנינו. אז אנחנו הולכים ליצור קובץ בשם view.blade.php. אז בתוך תבנית זו, מה אנחנו הולכים לעשות הוא להרכיב דף פשוט ש מאפשר לנו להציג את התוכן. אז אנחנו עושים סעיף, זה עוד לפני התוכן. להפסיק. ומה אנחנו הולכים לעשות בתוך כאן הוא לכתוב כמה HTML כדי להציג דף זה. אז אנחנו הולכים לעטפו אותו במפואר אלמנט HTML5 חדש בשם מאמר. וכאן, אנחנו הולכים יש כותרת שבי אנחנו הולכים לי h1 פשוט, הכולל את כותרת ההודעה. אז הנה, אם אנחנו מסתכלים על זה סימון סד מתולתל כפול, זה יעשה במהות PHP הד כותרת הודעה. אז זה קיצור מועיל שLaravel מספק לנו. אז אנחנו הולכים להשתמש סימון זה במקום. והנה, אנחנו הולכים גם להדפיס את התוכן שלה. וכאן, אנחנו הולכים לעשות פוסט תוכן. ולמטה בתחתית מה שאנחנו הולך לעשות הוא ליצור כותרת תחתונה. ובכותרת התחתונה, אנחנו הולכים תצוגה ראשונה כאשר זה פורסם. אז זה פורסם ב, שנוצר ב. וLaravel משתמש ממש נחמד ספריית מועד נקראת פחמן. אז אנחנו באמת יכולים לעשות משהו שנקרא difforHumans, שבו אתה ראית קודם לכן. כאשר אנו פורסמו. זה אומר, כמו, לפני חמש שניות. אז זה ממש נחמד הפונקציונליות של Laravel. ולבסוף, אנחנו הולכים כדי לסגור תחתונה זה. אז עכשיו אם נחזור ל דף הבית אנחנו הולכים לראות שום דבר כאן עדיין כי לא קדדנו את דף הבית. אבל אם אנחנו הולכים לפרסם נטוי אחד, אנחנו הולכים לראות יוצא מן הכלל. האם מישהו יודע למה אנו רואים חריג? מה חסר לנו? רעיונות? אז מה עשה שאנחנו עושים מוקדם יותר עבורנו למעשה כדי להגדיר את האופן שנגיע ל בקרים מסוימים? 1 SPEAKER: המסלול? ERIC אויאנג: כן. אז אנחנו עדיין צריכים להגדיר את המסלול. אז אנחנו חוזרים לכאן כדי routes.php. תוכל להבחיננו ש לא מוגדר למעשה איך אנחנו הולכים לקבל בקר זה. אז עכשיו אנחנו הולכים להגדיר בדרך זו. זה פשוט למדי, בדומה למה שעשינו קודם לכן. אבל מה אנחנו הולכים לשים לב כאן הוא שאנחנו הולכים יש לי מציין מיקום. אז אם אנחנו עושים פוסט לוכסן ID route.get. אז ID עכשיו הוא מה קורה ל יועבר לתוך הבקר. זה הולך להשתמש ב בקר שאנחנו פשוט נוצר, BlogController בviewPost. ואנחנו הולכים ל כינוי זה כviewPost. גדול. אז עכשיו אנחנו הולכים ליצור בדרך זו. אז עכשיו אם אנחנו הולכים כאן ולרענן את הדף, יש לנו למעשה הפוסט החדש בבלוג שלנו. אז זה מה שיצרנו קודם לכן. מאוד דף פשוט, אבל מציג פוסט בבלוג שיצרנו זה עתה. מגניב. ואם אנחנו באמת לעבור את כל תהליך של יצירת פוסט חדש בבלוג, אנו שמים לב כל מה ש הפניות כראוי. אם אני אומר, "היי. אני ג'ונתן טאן. " אומר, "זה הפוסט בבלוג שלי." ולהגיש אותו, זו תיצור הפוסט הזה בבלוג החדש עם זיהוי 2, שמרווחים ממה שהיה לנו בעבר ומציג אותו כמו שצריך. מדהים. יש שאלות? כן? SPEAKER 2: האם ידית Laravel חיטוי והכל בשבילך? ERIC אויאנג: כן. לכן, כאשר ראינו קודם לכן, כאשר עשינו מעי גס מעי גס קלט לקבל, שsanitates כל SQL זריקות ומה לא שאולי אנחנו רוצים לבצע אם אנחנו משתמש זדוני של האתר. אז Laravel מטפל הרבה של שמאחורי הקלעים. שאלה טובה. אז בואו נסתכל על דף הבית. אז אם נחזור ראשון בקר לדף הבית, תוכל להבחין כי זה לא עושה הרבה כאן. תוכל להבחין כי אנחנו לא עובר לבקר זה שום דבר מועיל במיוחד. זה רק קובץ אינדקס זה. אז בואו נעבור ל זה משהו מועיל. ובאופן ספציפי, אנחנו הולך לעבור בהודעות. וLaravel מאפשר לנו לעשות פוסט כל, ש יאפשר לנו לקבל את כל ההודעות שנכתבו. עכשיו, אם אנחנו חוזרים ל index.php, תראה, היי. שום דבר לא כאן עדיין. אבל מה שאנחנו רוצים לעשות כאן למעשה לחזר דרך, לעשות foreach לולאה על ההודעות ש מאפשר לנו להדפיס את ההודעות. הודעות אז foreach כ פוסט, מה שאנחנו רוצים לעשות הוא להדפיס את התוכן של הפוסט בבלוג. אבל דבר אחד שתבחין הוא ש אנחנו באמת כתבנו את רוב הקוד ש כבר, בview.blade.php. אז מה אנחנו הולכים לעשות הוא למעשה להשתמש בתכונה מועילה נחמדה של Blade וגורם את קוד נפוץ זו. אז אנחנו הולכים כאן. אנחנו הולכים לקחת את התוכן הזה ממש כאן, ומה שאנחנו הולכים לעשות הוא ליצור תיקייה חדשה. בואו פשוט נקראים לזה החלקיים. וכאן, אנחנו הולכים כדי ליצור post.blade.php. אז הנה, אנחנו בחשבון את הדרך ב שבו אנו רוצים להציג הודעות אלה. והנה מה שנעשינו במקום למעשה יש HTML באופן ישיר, אנחנו הולכים להשתמש בהוראה זו נקרא כולל blog.partials.post. ומה אנחנו הולכים לעשות כאן הוא לעבור בפוסט של הדף. אז עכשיו אם נחזור לכאן, אנחנו שם לב שהפונקציונליות היא עדיין אותו הדבר. אבל עכשיו יש לנו את זה בחשבון את הקוד, HTML זה. כדי שנוכל להשתמש בו במדד. אז הנה, זה מאוד פשוט. כל מה שאנחנו עושים זה כולל blog.partials.post ומערך. ואי ל לפני, אנחנו עושים פוסט פוסט. אז עכשיו אם נחזור ל דף הבית, אנחנו אראה את זה, היי. יש לנו רשימה של כל רשום בבלוג שהיו לנו בעבר. אנחנו אולי רוצים להוסיף כמה "אם" תנאים והגבלות "אחרת" כך שאם אין לנו שום דבר בבלוג, אנחנו רוצים להציג משהו מועיל. כמו, היי. אין עדיין תוכן בבלוג. ואם אתם באמת מסתכלים על קוד ההפצה על GitHub, תראה דוגמא של איך אנחנו עושים את זה. מגניב. יש שאלות? כן. SPEAKER 2: אני מניח שפשוט שאלה בסיסית. חזרה במסלול. ERIC אויאנג: כן. אם נסתכל על מסלולים. SPEAKER 2: איפה עושה uses.blogcontroller ביצירת הודעה, מה זה לכוון אותנו ל? ERIC אויאנג: כן. כן. SPEAKER 2: או מה הוא that-- ERIC אויאנג: אז, תסתכל, אומרים לדוגמא, בדרך זו ממש כאן. החלק הראשון הוא בפועל כתובת אתר שהמשתמש ילך ל. ומערך זה כאן, מערך אסוציאטיבי, מגדיר איך אנחנו רוצים שנהיה לי מעשה יישום בתגובה לזה. אז משתמש בהוא בקר, הפונקציה ש רוצה לקרוא כאשר משתמש מגיע לכתובת אתר זו. אז viewPost כאן היה פונקציה שהגדרנו בתוך של BlogController-- SPEAKER 2: אני מבין. ERIC אויאנג: --so ש למעשה יכול להפוך נוף, לבצע כמה חישובים, אינטראקציה עם מסד נתונים SQL. SPEAKER 2: אישור. ERIC אויאנג: ואז אחר חלק, "כמו" הוא כינוי שאנו משתמשים. אז אם אנחנו שמים לב כש יצרנו צורה, תוכל להבחין URL ש:: routecreatePost. אז זה מחליף בעצמו כתובת אתר, כך שאנחנו לא קשים קידוד אלה בכך שאנו יכולים לשנות את זה פעם אחת, אומרים אם אנחנו רוצים לשנות את השם. במקום הודעה נטוי חדש, אנחנו רוצים לעשות כמו, עמ ' סלאש חדש רק כדי לנקות עד כתובות האתרים שלנו קצת. אנחנו אשנה את זה במקום אחד ולא מ פני כל הקבצים השונים. מגניב. זה טוב. אז עכשיו יש לנו מאוד פלטפורמת בלוג בסיסית. אנחנו כנראה רוצים להוסיף בלחצן כל כך שאנחנו באמת יכולים ליצור הודעות חדשות. אז אם אנחנו נסתכל בMaster הפריסה, יש לנו סעיף שנקרא כותרת ימנית כי יש לנו רק שהוגדר למעלה בחלק העליון. כדי שנוכל להוסיף לחצנים ל החלק העליון של הכותרת. אז אם אנחנו הולכים לindex.blade.php, למעשה לעשות הוא להגדיר מה הולך בתוך מכאן. אז סעיף כותרת זכות זו, מה אנחנו הולכים לעשות הוא מוסיף בכפתור ללכת ל כתובת אתר שהוגדרה על ידי ההודעה החדשה המסלול. רק כדי לנקות אותו ולהפוך את זה יפה וכל Bootstrap, אנחנו הולכים לעשות לחצן ברירת מחדל זה. בואו פשוט לעשות את זה גדול בשביל כיף. ובתוך זה, אנחנו יכולים לשים את טקסט כלשהו. אבל מה Bootstrap מספק הוא glyphicons. אז אנחנו באמת יכולים להוסיף שב עיפרון נחמד שראינו קודם לכן. Glyphicon. Glyphicon-עיפרון. אז זה יאפשר לנו לשים בסמל במקום טקסט. עכשיו, אם אנחנו עוצרים, זה יגדיר סעיף זה. ו, היי. יש לנו כפתור נחמד שמקשר אותנו ישירות ללהוסיף לכתוב בלוג דף. אז יש לנו בלוג פשוט למדי. אנחנו יכולים להוסיף דברים לזה. אבל מה אנחנו בדרך כלל מצפים מבלוגים הוא להעיר. אז זה באמת חשוב לנו שיש לי, אומר, אם מישהו אחר מבקר באתר ובאמת אוהב את הפוסט ש הם יכולים לעסוק בדיון עם אנשים אחרים שמבקרים בדף. אז אנחנו הולכים ללכת וליצור טבלת מסד נתונים חדשה ומודל חדש כדי שנוכל לשייך תגובות עם הודעות. הצעד הראשון אז, בדיוק כמו לפני, הוא שאנחנו צריכים להפעיל את הגירה. אז כמו בעבר, אנחנו עושים להגר php אומן: לעשות. ואנחנו הולכים ליצור אחת נקרא create_comments_table. הפעולה זו תיצור קובץ כי יש ההגירה החדשה שלנו. ואנחנו הולכים, כמו לפני, להגדיר טבלה חדשה. אז סכימה :: ליצור טבלה בשם הערות. פונקציה זו כאן. ובתוך שולחן זה מה ש אנחנו הולכים לעשות הוא ראשון, כמו בעבר, להקצות ID. מגדיל ID. אנחנו הולכים כדי לאפשר למשתמשים לקשר שמם עם תגובה מסוימת. אנחנו הולכים לקבל קצת תוכן ש הולך יחד עם, תוכן הטקסט הזה. והנה מה שאנחנו הולכים ל לעשות משהו שונה. אנחנו הולכים ליצור מספר שלם זה נקרא post_id ש הולך לסמן מה פוסט תגובה מסוימת הולכת עם. בנוסף, אנחנו בעצם הולכים להגדיר אילוץ מפתח זר בזה. אז MySQL יהיה לאכוף את זה. אנחנו לא מנסים ל להקצות מספר תגובה 5 לפרסם 5,000 אם יש לנו לא היו 5,000 הודעות על זה. אז מה אנחנו עושים כאן, אנחנו עושים post_id הזר הולך להיות קשור ל השדה מזהה מההודעות שנכתב על השולחן. ואנחנו באמת נעשה משהו אחר מועיל, הוא onDelete. אז אם אנחנו מחקו חלק לפרסם מבסיס הנתונים, כי אנחנו רוצים מפל מוחק להערות גם כן. כי זה לא מאוד מועיל שתהיינה לנו הערות על הודעות שלא קיימים. ולבסוף, כמו בעבר, אנחנו הולך להגדיר חותמות זמן על זה. וכמו בעבר, אנחנו הולכים יש לי ההגירה ההפוכה להיות שומט את שולחן ההערות. אז עכשיו אם נחזור לכאן, אנחנו הולכים לרוץ הגירה זו, להעביר אומן. ועכשיו זה יישם את זה הגירה שיצרנו זה עתה. אז אם אנחנו מסתכלים phpMyAdmin, אנחנו עושים, למעשה, עכשיו יש שולחן הערות שיש מבנה שאנחנו פשוט מצוינים. אז כמו בעבר, אנחנו הולך ליצור מודל חדש למופשט שולחן SQL שזה עתה יצר. אז בואו להוסיף קובץ חדש. אנחנו הולכים לקרוא לזה comment.php. וזה באמת הולך להיות די פשוט עם שינוי קל ממה שהיה לנו קודם. אז הערה כיתה משתרעת רהוטה. ומה אנחנו הולכים לעשות כאן הוא להגדיר פונקציה ש מערכת יחסים עם דגמים אחרים. אז אנחנו הולכים להיות פוסט פונקציה כאן שמחזיר את הקשר הזה. אז אנחנו נקבע, כי זה שייך לפרסם, אומר שיש פוסט אחד שתגובה זו שייכת ל. זה בעצם צריך להיות P הון למודל. ועכשיו רק על להעיף האחרים צד, יש לנו לומר ש, היי. יש הודעות הערות. אז מה אנחנו הולכים לעשות הוא להגדיר הערות תפקיד ציבוריות. והנה הוא חזר זה יש הרבה תגובות. אז עכשיו באורח פלא כאשר יש לנו הודעה, אנחנו יכולים לקבל את הערות התכונה וזה יהיה לאכלס אותה ב מידע ממאגר המידע. אז בואו באמת לעבור ו להוסיף תכונה חדשה לקובץ התצוגה שלנו כך שנוכל גם תצוגה וליצור תגובות. אז אנחנו הולכים להגדיר סעיף חדש. בואו פשוט להפריד אותו עם שלטון אופקי. id סעיף "הערות" =. מה שאנחנו הולכים לעשות כאן הוא, כמו בעבר, לחזר דרך כל ההערות. אז בעצם איך אנחנו עושים את זה, כפי שציינתי, בהגינות קסומה. אנו עושים לכתוב תגובות. ואז אנחנו יכולים לעשות את זה עבור כל לולאה על כל אחת מההערות. ומה אנחנו הולכים ל לעשות היא תגובה כיתת div, ואנחנו הולכים בעצם להדפיס את ההערה הזאת. אז להציג כי היי, להגיב name-- האדם שפורסם comment-- זה אומר dot dot dot. אנחנו הולכים לשים את זה בבלוק ציטוט, רק כדי לגרום לזה להיראות נחמד. ולאחר מכן להגיב בלוק ציטוט תוכן. וforeach. אז עכשיו זה הולך לולאה דרך כל ההערות המשויך עם כל אחד מההודעות ולהציג כל אחת מההערות האלה. אני הולך להוסיף סעיף נוסף במורד כאן, אשר מאפשרת לנו להוסיף הערה. כיתה אז H3. שים כותרת כאן. הוסף ביקורת. ואנחנו הולכים להגדיר צורה חדשה. אז כמו בעבר, אנחנו הולך לעשות פעולת טופס. והנה, הפעולה החדשה היא שאנחנו הולך להגדיר בקר חדש ש מאפשר לנו להגיב לתגובה בקשות ליצירת הערות. אז createComment URL :: המסלול. אני הולך לעבור בפרמטר כאן. ID של ההודעה ש אנו יוצרים תגובה ב. ולאחר מכן את השיטה הזאת טופס הולך להיות פוסט. עכשיו אנחנו הולכים להוסיף ב שני שדות, קבוצת טופס. זה הולך להיות קלט עם שם "שם" וclass = "טופס-שליטה", הקלד = "text", ועם מציין מיקום = "השם שלך." גם אנחנו הולכים להגדיר שדה צורה אחרת, ש הולך להיות טקסט אזור שהיינו לנו בעבר. בדיוק כמו קודם, קורא לזה תוכן. Class = "טופס-שליטה." מציין מיקום = "כתוב כאן". ורק כדי ש באמת יכול להגיש אותו, להגיש סוג וclass = "BTN BTN-יסודי." סגור את הטופס. סגור את הפעולה הזו. אז עכשיו אם אנחנו לרענן את הדף שבו זה יש לנו, למשל, שלאחר בפרט. אנחנו צריכים לאתחל מחדש את השרת. אומן PHP משרת. אתחלתי את זה. אנחנו צריכים להגדיר את המסלול. אבל לעת עתה, בואו פשוט לקחת את זה מתוך כך שלמעשה יכול להראות לך מה שנראה כמו הדף, ולאחר מכן אנחנו בעצם ניצור מסלול ש. אז, היי. יש לנו צורה חדשה זו כאן כדי שנוכל ליצור תגובות. אז בואו למעשה מגדירים פונקציה בתוך בקר כדי שנוכל להוסיף הערות. בואו נחזור. ובתוך blogcontroller.php, מה אנחנו הולכים לעשות הוא ליצור פונקציה חדשה נקרא ליצור תגובה. createComment התפקיד ציבורי. זה הולך להיות אחד פרמטר, זיהוי של ההודעות כי אנחנו להעיר על. וכמו בעבר, אנחנו הולך ראשון לקבל את ההודעה. אז לפרסם, id findOrfail. לאחר מכן, אנחנו הולכים כדי ליצור תגובה חדשה. אז להגיב = הערה חדשה. תגובה name = קלט :: לקבל את השם. תוכן תגובה = באותו קו חדש להפסקות תשומה :: לקבל תוכן. ולבסוף, אנחנו הולכים צריכים לשייך את התגובה הזו עם הפוסט. אז אנחנו הולכים להשתמש פונקציה זו, הערות, המאפשר לנו לחסוך מערכת יחסים זו. אז עכשיו הערה זו תהיה באופן אוטומטי לאחר זיהוי. אנחנו יכולים גם להגדיר את זה באופן ידני, אבל זה יותר קל לקריאה ככל כפונקציה הולכת. ולאחר שאנו מבצעים זה, מה שאנחנו רוצים לעשות הוא להפנות את המשתמש ל מסלול שצוין על ידי viewPost עם המערך עם פרמטר של הפוסט ID. ועכשיו, כך שזה בעצם פונקציות, אנחנו צריכים להגדיר בדרך זו. כביש :: פוסט. ועכשיו אנחנו הולכים לקרוא לזה הודעה לקצץ תגובה לוכסן ID. מערך משתמש בפונקציה החדשה שזה עתה יצר. BlogController. CreateComment כcreateComment. גדול. אז עכשיו אני מקווה שאם אנחנו לרענן את הדף ולהוסיף בתגובה, למשל, דוד מלאן. "אני מקווה שזה עובד." שליחה. אין, למעשה, יש לנו להגיב על הפוסט הזה בבלוג. מגניב. אז עכשיו יש לנו די לכתוב בלוג פונקציונלי. אנחנו רק הולכים להוסיף כמה tweaks כך כי יש לנו כמה שימושי יותר מידע על הודעות אלה. אז אם נחזור ל עמוד ראשון, יש לנו לא הגיוני של כמה הערות בכל אחד מהתפקידים אלה. אז מה אנחנו בעצם הולכים לעשות הוא, בתוך המודל שלנו, להגדיר פונקצית עוזר המאפשרת לנו לציין את מספר ההערות כי ללכת עם פוסט מסוים. אז אנחנו הולכים ליצור פונקצית עוזר. תפקיד ציבורי. GetNumCommentsStr. אז מחרוזת המציינת את המספר הערות כי ללכת יחד עם זה. ומה שאנחנו הולכים לעשות הוא לומר num שהערות זה = לספור. אז אנחנו הולכים לספור מספר ההערות. ואם מספר זה שווה 1, אנחנו רק הולך לחזור 1 תגובה. ואז בדרך אחרת, אנחנו רוצים לחזור שרשור של num והערות, ולכן אנחנו מקבלים נכונים pluralization. כל שעליך לעשות זה ציטוט אחד. תגובה אחת. ועכשיו אנחנו יכולים להשתמש בפונקציה זו ישירות בתוך שדה הראייה שלנו. אז אם נחזור ל הודעות חלקיות שיצרנו, עכשיו אנחנו רוצים בעצם להציג את מספר ההערות. אז מה אנחנו יכולים לעשות הוא הודעה, להשתמש בפונקציה זו כי אנחנו פשוט נוצרו כדי להציג את מספר ההערות. אז אם אנחנו עכשיו לרענן, זה עושה, למעשה, תצוגה הערות המספר כי ללכת יחד עם זה. אם אנחנו רוצים להיות מפוארים אם אתה למעשה מסתכלים על קוד ההפצה, אנחנו באמת יכולים לקשר זה להערות. אם אתה זוכר, שהגדרנו ב להציג שיש להערות ID הסעיף. אז אם אנחנו באמת רוצים לקשר ישירות לסעיף ההערות, מה היינו עושה כאן הוא href כתובת אתר של viewPost המסלול. לעבור בזיהוי המערך של הפוסט ID. ולאחר מכן אנחנו רוצים ללכת ל במיוחד סעיף ההערות. הנה בואו לסגור את תג. אז עכשיו אם אנחנו לרענן זה דף, אנו לוחצים על זה. נלך ישירות ל סעיף ההערות. אם היו לנו עוד הודעה, אתה יכול ממש לראות להקפיץ את זה למטה. אבל תשימו לב שזה לא בחלק העליון של הדף. מגניב. גדול. אז זה פשוט למדי דוגמא למשהו פשוט שאתה יכול לעשות עם Laravel. אבל אתה יכול לשים לב כאן ש עשינו הרבה דברים עם כמות קטנה למדי של קוד. Laravel מאפשר לנו לעשות שאילתות SQL מאחורי הקלעים. הוא עושה תברואה לנו מאחורי הקלעים. מאפשר לנו לעשות יחסים אלה מאוד בקלות וללא צורך בנו לעשות כל SQL להצטרף הצהרות ל לשלב הערות עם מה את ההודעות. מאפשר לנו לעשות את זה ירושה של תבניות כדי שנוכל להגדיר קינון אלה קבצים ולכן אנחנו לא חוזרים על עצמנו, בדיוק כמו כאשר היינו ש תצוגה של פוסטים בבלוג כי אנחנו לא צריכים להעתיק ולהדביק את הקוד. ומכאן אתה יכול לבנות יישומים מורכבים יותר ויותר. אתה יכול לדמיין אם רציתי ליישם יומן ב, נוכל לומר, להביא בצד שלישי מסגרת המאפשרת לנו לעשות את זה. יש חבורה שלהם כי הם באמת, באמת גדול שיכול לעשות כמו, שחזור סיסמא. וזה ישלח לך לאפס את הסיסמה של דואר אלקטרוני. אנחנו יכולים ליישם את רשות כך שאני יכול ליצור הודעה, אבל מישהו אחר לא יכול לערוך אותו. אנחנו יכולים ליישם פונקציונליות למחוק את ההודעות. אבל אתם יכולים לראות כאן שיש לנו די הרבה כל מרכיבים הבסיסיים לבנות כמה באמת, באמת, Web Apps הדינמי ומרגש. אז עם זה, אני חושב שאנחנו טובים. האם יש לך חבר 'כל שאלות? כן? SPEAKER 3: איך אתה לקבל תוכן סטטי? ERIC אויאנג: תוכן סטטי. אז אתה ראית בעבר שכאשר היו לנו זכות זו כאן, תוכן פריסה זו, איפור תצוגה, היו לנו את זה ללא מערך זה אחר כך. Blog.index, היו לנו את זה רק כקובץ סטטי. אז אם אנחנו לא עוברים שום דבר לאורך לזה, זה פשוט הופך את HTML ישירות. אבל אם אנחנו עוברים באסוציאטיביים זה מערך של הודעות, שהוא באופן דינמי משך מבסיס הנתונים, אנחנו יכול להפוך את הדף דינמי. מגניב. יש עוד שאלות? SPEAKER 3: איך היית משווה Laravel לאולי כמה אפשרויות אחרות? ERIC אויאנג: בטח. כן. אז Laravel is-- זה question-- גדול אחת מאפשרויות רבות למסגרות אינטרנט. אז Ruby on Rails הוא אחד זה פופולרי. אני מאמין טוויטר הייתה אמורה להיות מיושם עם Ruby on Rails. אני חושב שמאז שהם עברו. יש עוד אחד בשם FuelPHP. אז Ruby on Rails משתמש בשפת Ruby ומיישם הרבה הדברים MVC שאנו רואים כאן. FuelPHP היא מסגרת PHP אחרת. Django הוא אחד המועדפים שלי. זה אינטרנט מסגרת לפייתון. אז אתה יכול לכתוב יישום האינטרנט שלך בפייתון. אז יש המון אפשרויות אלה. Laravel, אני חושב, על ידי ו גדול הוא תקין האהוב עליי עכשיו לPHP רק בגלל ש של הרכיבים שדיברנו עליו קודם לכן. המלחין שלו מופעל. הוא כולל באמת, באמת מערכת ORM הבעה. יש בניית תבנית באמת מדהימה גם שפה שחלק מהאחרים פשוט לא מספק. והגירה. הגירות הם מדהימה גם כן. מגניב? מדהים. ובכן, תודה רבה ל צפייה בסמינר זה, ומזל טוב על הפרויקטים האחרונים שלך.