[Семинар] [Kohana: A Lightweight PHP Framework] [Brandon Liu] [Harvard University] [Това е CS50.] [CS50.TV] Здравейте всички. Моето име е Brandon. Аз съм младши тук в колежа прави компютърна наука, и днес ние ще говорим за Kohana, който е рамка уеб програмиране PHP. Днес ще бъде на живо кодиране на семинар, така че аз съм в основата си ще прекара 5-10 минути обяснява какво Kohana е, и тогава аз съм буквално ще изгради супер проста блог за вас точно тук буквално от нулата. Отиваме, за да изтеглите кода от уебсайта Kohana, и ние ще започнем изграждането на блог, и се надяваме, че ще бъде много поучителен, защото ще видите може би може би ще направи някои грешки, и ще видите, ме възстанови от тях, или вие ще видите моя мисловен процес, както аз се изгради чрез този блог, а междувременно, вие също така ще се запознаят със самата рамка. Надяваме се, че ще бъде много поучително упражнение. Първо, какво точно е рамка? Ако сте били като CS50 досега, не сте наистина е работил с всеки рамки все пак, и това нещо е това. Вие вероятно сте направили една PSET уеб програмиране вече, и нека да кажем, че продължавате да се изгради уеб сайтове, изграждане на уеб сайтове и пазят. Вие ще започнете да забележите няколко неща. Първото нещо, което ще забележите, е, че вие ​​вероятно правиш едни и същи неща отново и отново, през цялото време, неща като почистване потребителски входни данни, неща, като организиране на вашите файлове по определен начин. Другото нещо, което също вероятно ще забележите, е, че вашият код може да започне да се превърне в много, много разхвърлян, и вие може да го напусне разхвърлян и просто имат много трудно да го поддържа, или може да се започне да се структурира своя код и което го прави модулната в някои начини да го направим по-възможна за поддържане. Това е мястото, където уеб рамки основно идват инча Тези хора, които са изградили много сайтове, те казаха: "Ние не трябва да повторите това всеки път, когато се изгради една интернет страница." "Защо просто не направите пакет, който прави всички тези неща за вас всеки път, когато искате да се изгради един сайт? " И така, че когато се направи нов сайт, можете просто да се съсредоточи върху това, което точно този конкретен сайт е за. Вие не трябва да се повтаря всички различни конфигурация и разделяне на кодове и пренаписване на код че често трябва да правите, когато вие правите сайтове. Идеята е, че една рамка ви позволява да пишете код от по-високо ниво без да се налага да се притеснявате за подробности по-ниско ниво. A подробно по-ниско ниво може да бъде нещо като занимаваща се с почистване на потребителски входни данни. Това е нещо, което не трябва да наистина трябва да се притесняваш. Вие трябва да се съсредоточи върху това, което ви разпределение Мрежата е всъщност въпрос. То премахва много шаблон код. Това е архитектура за вашия проект. Най-популярният ще бъде Model-View-Controller, което аз отивам да се говори за в секунда. И много пъти тези рамки въплъщават набор от процедури, правила, както и най-добрите практики за да можете да използвате така че, когато приеме уеб рамка Вие трябва да напишете кода си по определен начин, и това е обикновено е договорено набор от принципи, от страна на Общността, че е общоприето да бъде добър начин на писане на код. Това прави кода по-възможна за поддържане, по-използваеми, така нататък и така нататък. И накрая, нещо, което искам да подчертая, за рамки спрямо библиотеки е тази идея за инверсия на контрол, и това нещо е това. Разликата между библиотека и рамка е, че с библиотека все още сте писането на основната програма, и вие сте нещо като се позовава на библиотеката и призовават библиотеката, за да направя нещо за теб. Разликата между библиотека и рамка е, че рамката започва с контрола, и тя се позовава на своя код, така че можете да мислите за него като - това е защо тя се нарича рамка - рамката предоставя тази рамка и структура за вашия код, и да попълните дупките, и това ще станат по-ясни в секунда когато ме види да започнете да пишете код в контекста на рамката. Вие ще видите, че аз съм запълване на пропуските, и рамката е вид контрол на всички движещи се части на, и аз трябва да се постави парчета на правилните места. Днес ние ще говорим за Kohana, който е един от многото PHP рамки. Има уеб рамки, а има и такива, в почти всеки един език, и аз съм бране Kohana Kohana защото е може би и общопризнат като най-лесният рамка PHP да вдигнеш. Това е най-лек. Има и други хора там, които идват с много, много повече функции, но те са склонни да бъдат по-трудно да се вземе. И най-накрая, Kohana използва архитектурата MVC. Това е достатъчно лек, че буквално можем да изградим един проект точно тук, точно пред очите ти, и ще можете да хубав много следват заедно доста лесно. Какво е архитектурата MVC? Той е за Model-View-Controller, и може би, ако мислите, че за кода, който съм писал досега за някои от вашите psets уеб програмиране може да имате възможност да видите някои от това, но обикновено, когато започнете да пишете по-сложен уеб приложение, разделението между тези три сегмента става все по-очевидна. I изложени на MVC тук нещо като комин, и често ще чуете хората да говорят за стекове в уеб програмиране, и това е да илюстрира идеята, че всеки слой, всеки компонент наистина само се опитва да комуникира между две други компоненти. Някой има достъп до вашия сайт като клиент или браузър. Те си взаимодействат с вашата програма чрез кода за оглед. Кодът за оглед взаимодейства с контролера. Контролерът взаимодейства с модела, и модел взаимодейства с SQL база данни. И няма подскача между тях, ако напишете кода правилно. Какво правят тези неща? Моделът по същество е част от код, който се занимава с вашите данни. Всичко, което се занимава с вашата база данни, с обектите, които съхранявате, или извличане на тези обекти в базата данни, че всичко се обработва от модела. Може би имате обекти във вашата база данни. Отиваме да се създаде модел се налага да правя с мнения, така един пост може да има някои атрибути към него. Вие може да има функции по съхраняване на тези постове или извличане на мнения или филтриране на постовете и така нататък и така нататък, и това е целия код, който се обработва от модела. Контролерът е нещо като логиката на приложението, и много различни неща могат да отидат в логиката на приложението. Ако говорим за различен API, че може да бъде, когато си имаш работа с логиката на приложението. Ако се опитвате да трябва да се въвеждат в данни от множество различни модели и трябва да ги комбинирате по някакъв начин, че често могат да бъдат обработвани от администратора. За пример, на Facebook, ако някой приятел, тогава може би този акт за установяване на тези отношения може да се извършва от администратора. И накрая, гледката е кодът, който се генерира това, което виждате в действителност. Много пъти Мисля, че през psets CS50 те наистина не ви насърчаваме момчета да отделя тези три неща. Вероятно ще има този голям, дълъг файл, в който най-отгоре ти направя SQL заявка и може би се направят някои обработка основа на данните, извлечени от базата данни, и тогава ще трябва всичките си HTML в долната част. И вие може да откриете, че докато създавате все повече и повече страници че започваш да има някакъв код повторение, и също така, Работата е вашият файл става наистина голям и дългосрочен и става тромава за управление. Причината, поради която е толкова добре MVC считат е за редица причини. Първото нещо, което е нещо, наречено отделяне на безпокойство което е идеята, че когато имаш - в идеалния случай една част от кода трябва да направи едно нещо и да го направя наистина добре, и не трябва да се комбинират части от код, които правят коренно различни неща. За пример, да видите код и модел код, те наистина не трябва да бъдат свързани. Те не трябва да са в едни и същи файлове, така че, когато можете да ги отделят така че е лесно да се поддържа. Другото нещо е код повторна употреба. Можете да откриете себе си писането на същия SQL заявка или правиш подобни заявки, които могат да бъдат черпени в една функция, и това е идеята зад модели и контролери, го има в отделна функция, която можете да използвате повторно в различни места във вашия проект. И най-накрая, че е вързан за сушене кода си, или да не се повтарят, не се повтарят себе си. Това е много разбираем в развитие. Винаги, когато можете, вие не искате да се повтори, защото ако се повтаря себе си,  това е много по-скъпо да се поддържа. Ако искате да промените едно нещо, вие трябва да го промени навсякъде, и това води до грешки, и това е ужасно. Добре. Всякакви въпроси, досега около Kohana изобщо? Чудесно. Сега отиваме да се потопите в живо кодиране сесия, и се надявам всичко да мине добре. Аз отивам да се основно изграждане на този уеб сайт на един от моите отдалечени сървъри, и по този начин вие може също виж Интернет и достъп до сайта, и околната среда е по-добре конфигурирано от ми отдалечена машина, защото това е тичане Linux вместо OS X. Ние буквално ще започне. KohanaFramework.org. Отивам да изтеглите кода от сайта. Отивам да копирате адреса на връзката, отидете на моя сървър, да го изтеглите, и аз отивам да го извлечете. [Student] Какво е най-големият ви може да направи текста? [Brandon Liu] е, че по-добре? [Student] Това ли е постижимо? [Brandon Liu] Да, това е добре. Свалих един ZIP файл и разкопчан, че в директория, наречена Kohana, и ние отиваме да преименувате, че CS50-Kohana, и да вървим инча Awesome. Тук можете да видите един куп различни файлове. Повечето от вас може да пренебрегне - Ние не сме ще да мине през всеки един файл, който е тук защото на нашите ограничения във времето, но като цяло, когато инсталирате Kohana, първото нещо, което правите е да отидете до директорията, и че основно ще се направят някои тестове на околната среда и какво ли не да се уверете, че вашата среда е правилно настроена да работи Kohana и се уверете, че всичко е наред. Можете да видите повечето неща минаха, но по принцип винаги се сблъскате с този проблем 1 където той се оплаква, че някои директория не е празен, и това е така, защото на някои разрешения. Аз не знам колко момчета са научили за файла разрешения в CS50, но ако го направите уеб програмиране, вие ще се сблъскате с този проблем много. Отивам да се направи достъпна за писане и аз мисля, че също трябва да - там отиваме. Добре, така че сега можете да видите всичко, което премина, и сега ще ви кажа, за да преименувате файла install.php. Отивам да преместите файла install.php да installed.php, и сега, ако аз опресняване, това ми дава някаква грешка, и това е мястото, където отстраняването на грешки идва инча Това е мястото, където можете да видите какво всъщност ще се случи. Работата е там, по подразбиране се приема, че Kohana Вашият проект е в главната директория на вашия домейн, така че е очаквал да бъде най-demo.brandonkliu.com. Ние трябва да го кажа, че това е всъщност в подпапка. Това е в подпапка, наречена CS50 Kohana. Работата е там, че е погрешно тълкуване CS50-Kohana като нещо друго, което да ви аз ще обясня в секунда. Но аз трябва да ви кажа, че това е нещо, което е да се очаква. Това, което ще направя, е, че ще отидат в тази папка, наречена bootstrap.php, което е папката конфигурация, където много различни неща са създадени. Отварям, че до. Тогава може би едно от първите неща, които ще направите, е да промените часовата зона. И тогава да видим. Aha! Точно тук. Има един куп различни конфигурационни поговорки тук, но едно аз търся, е това нещо, наречено база URL, и по подразбиране да получа го настроите да Kohana, но аз няма да се промени, че да CS50-Kohana, и аз мисля, че трябва да се поправи. Да, чудесно. По подразбиране, за да се види, че това е работа, той казва, "Hello World". Откъде дойде това? Как стигнахме до Hello World? Къде точно е кодът, който всъщност е написал това? За да се разбере, че ще въведе тази концепция, наречена маршрутизация. Почти всички уеб рамки имат концепцията нарича маршрутизация, което е парче от софтуер, който ще очертае определен URL до определена част от код във вашата рамка. Например, ако имате някои URL и да отидете до някои URL като foo.com / блог / всички тогава какво рамката ще направи - или поне това, което Kohana ще направи - се, че ще се намери клас, наречен контролер блог, и че ще изпълни функцията на име действието всички. Знам, че говоря за клас и функции, И знам, че момчетата не са обхванати класове и функции В още CS50, но за сега, можеш да се сетиш на класове, както е просто група от функции, начин на групиране функции заедно. Това е наистина всичко, което трябва да знаете. Сега, ако се вгледаме в нашата структура на папките, в папката за кандидатстване има и друга папка, наречена класове, и другите папки се наричат ​​Controller и Model. Ако се вгледате в папката Controller, ние виждаме, че има файл, наречен Добре дошли, и можете да видите тук, е един клас, наречен Controller Добре дошли, и има функция, наречена действие Index, и това, което той прави, е да го излага тялото на вашия отговор на Hello World. Това е, когато кодът се пише. Другият въпрос е, добре, аз не отивам да дрън, дрън, дрън, / добре дошъл / индекс. Как се озовах тук? Е, това е просто защото тук в дъното на нашата фърмуера файл където ние се създаде нашите маршрути можете да видите, че те се определят някои настройки по подразбиране за вас. Контролерът подразбиране е дошла. По подразбиране, действието е Index. Ето защо, когато ние поставяме нищо там тя автоматично отиде до Welcome контролера и индекса действие. Всичко има смисъл досега? Сега, вие може да направи повече от това просто да отидете на Controller и конкретни действия. Можете също така да премине в параметрите на контролера. Само като пример, Отивам да се добавят още действия на този контролер, за да ви покажа. Нека наречем това действие Echo, защото това ще ви кажа, каквото и да му се даде, и така че аз съм основно ще вземете параметър, който ще бъде изпратен чрез мен към програмата за маршрутизиране, и както можете да видите тук, тази линия тук, можете да видите, че това по същество означава, че имате контролер, и имате /, и имате действия, а вие имате още /, и че ще бъде параметри, и защото имаме това име ID в рамките на ъглови скоби, това означава, че ние сме именуване този параметър ID. По-късно в моя код контролер, ако искам да вземете държат на този параметър, Мога да използвам кода съм написал, да намерите на параметъра име ID. Това е това, което направих тук, и аз отивам да се върне и да каже, "Ти каза, че" това. И сега, ако отида в нашия сайт, Аз отивам да cs50-kohana/welcome/echo/Helloooo-- О, това е добре. Има една стъпка оставих. Това е част от живото кодиране идея. Ето едно нещо. Нека да видим. Така че обикновено по подразбиране, с много от тези уеб приложения , което трябва да включи тази index.php нещо във вашия URL, защото идеята е index.php е нещо като входна точка на кандидатурата си, но разбира се, че е нещо досадно да има. Вие не искате да има index.php появи в URL, и почти всеки уеб рамка от кутията има тази index.php проблем, и затова трябва да се вземат някои мерки, за да бъдат в състояние да премахне това. И така, в този случай, това, което ние ще направим е, че започваш да се използва файл, наречен. Htaccess, и това е нещо, което е специфично за Apache уеб сървър, и той може да направи неща, като пренаписване на URL адреси и пренасочване на URL адреси, и така нататък и така нататък, и Kohana е достатъчно добър, за да предостави образец. Htaccess файл, който можем да използваме. Както можете да видите, има файл там нарича example.htaccess, и ние отиваме да копирате, че да. Htaccess. Отивам да отворя това и да го редактирате, и в общи линии го прави един куп различни неща. Основната линия, която може да искате да погледнете е точно тук. Идеята е, че това създава правило, което казва: "Добре, каквото и да напишете, предшестван index.php за това." Можете да видите това. The. * Означава нищо, съвпада с нищо, и след това втората част е index.php / $ 0, и $ 0 се отнася до това, което е съпроводено преди това. Това прави ли смисъл? Но наистина ключов нещо, което искам да се промени е да сменим това пренаписване база, който е URL база. Тя някак предполага, където вие работите от. Отивам да добавите CS50 Kohana към това, и по този начин сега, ако извадите index.php, тя трябва да работи, и аз отивам да добавите номера да ви покажа, че наистина е работа. Звучи добре. Всякакви въпроси досега? [Student] Как си го знаете, за да направи 123? Дали това е аргумент? Точно така. Можете да мислите за него точно като аргумент. Но най-странното нещо, което, обаче, е, че начина, по който го прави Kohana е, че те не го прави точно като аргумент. Вие трябва да го вземете като това. Вие трябва да вземете искане обекта и попитайте за параметър, който е кръстен ID, и това име ID идва от това фърмуера файл че показах по-рано, и идентификатора на име беше в тези ъглови скоби, и това е, как да вземеш тези параметри. Awesome. Някакви други въпроси? Както казах, контролери, те се справят с логиката на приложението, така че това е един случай, в който можете да видите, това е. - това е много основно, но тя все още е логиката на приложението, идеята за заграбването на параметъра и създаването на нов низ , който казва: "Ти каза бла", и след това плюе, че обратно към вас. И обикновено това, което правите е да създадете различни контролери. Вие създавате отделни контролери за различни части на вашия сайт. Днес отиваме да се направи един много прост сайт, и това ще бъде един много основен блог. Отиваме да се направи нов контролер само за публикациите в блога. Но след това, ако аз трябваше да добавите коментари към блог пост, Тогава най-вероятно ще искате да се направи нов контролер за тези коментари. Ако исках да добавя потребители, вероятно щях да добавите нов контролер за тези потребители, и като цяло, идеята е, че всеки път, когато имате нов модел, нов обект с данни, че си имаш работа, имате един-единствен администратор за този обект данни. Днес ние само ще се работи с един обект с данни, и че ще бъде мнения, и също така можеш да се сетиш на обекти на данни за съответно на таблици. По принцип всяка маса съответства на един вид обект с данни, така че след таблицата ще има един пост модел, което ще има един пост контролер, съответстваща на тази, и същото за коментари, еднакви за потребителите, и така нататък и така нататък. И това е общо правило на палеца. Там ще бъдат специални случаи, в които може да се различават от това, но 90% от времето, което е това, което ще се прави, и аз ще ви покажа, че е това, което ще се прави днес. 1 повече концепция, преди да се потопите обратно в кода, тази идея за обектно релационна картографиране. Вие вече сте свършили PSET уеб програмиране, и сте видели, че сте направили заявка SQL, и каквото и да се връща към вас са редове. Можете да получите тези редове, и вие ги индекс с някакво име, на името на колоната и на масата, и това е начина, по който се работи с него, и тя може да бъде малко по-тромави. Но освен това, ако имате връзки в рамките на вашата база данни, като например, ако имам коментари и мнения, тогава може би аз искам да вземете родителското поста на коментар. Ако използвам само на редове в SQL, след това всичко, което може да получи е ID на родител Мнение не и действителната самия пункт. Но когато сме кодиране, какво всъщност искаме, е действително да вземете  самата компания майка публикувате понякога. Какво обект релационния картиране прави се е необходимо резултатите от заявката на база данни и го слага в обекти за вас, които са много по-хубаво да се работи с от обикновени масиви и редове. Например, сега, когато имам коментар може би, и аз искам да вземете своя родител мнение, и аз може би коментира стрелка мнение, тогава той действително ще ми даде мнение обекта съответстващ на реалното родител пост, а не само някои ID, които в противен случай аз ще трябва да се използва и нов SQL заявка, за да вземете този пост, който е тромаво и ненужно. И освен това, чрез картографиране на всички тези редове от данни в обекти, можете да прикачите повече функции към обекти, така например, аз говорихме за това как класове по същество са обединения от функции. Можете да мислите за него по този начин. Например, може би аз имам този пост обект, а може би и аз бих искал да има някаква функция, прикрепен към него че основно ми казва, е, че наскоро е публикувал? Дали го е публикувал в рамките на миналата седмица, вярно или невярно? И това е функция мога да прикрепите към този обект, и това е наистина удобно да го има на същото място, и има множество различни функции, които можете да създадете за тези обекти, и това е наистина хубаво да бъде в състояние да го прикрепите към класа, на обект, докато ако просто трябваше редове, идващи от вашата база данни, тогава наистина не може да приложи никаква допълнителна функционалност към това. Това е буквално само данните. Всякакви въпроси за това на всички? Червеи са много чести уеб програмиране, и има много различни видове червеи, и Kohana има свой ORM. Това е много основен, но вие ще получите вкус на това, което изглежда. Нека да се създаде модел за нашите публикации в блога, и първото нещо, което очевидно трябва да направите, е да се създаде действителна маса в нашата база данни за действително съхранява нашите данни за тези постове. Първото нещо, което ще направя, е да отидете на PhpMyAdmin. Били ли сте момчета използват PhpMyAdmin преди? Добре, страхотно, така че вие ​​вече знаете какво е това, и аз отивам да създадете нова таблица, наречена Kohana Мнения, и това ще бъде много проста. Ще трябва да се регистрира отново инча Всички ние ще направим днес, е да има един автор и тяло, просто да го прости. Отивам да се създаде тази маса, и сега ние просто трябва таблица, представяща нашите мнения с две полета за нашия автор и нашето тяло. Другото нещо, аз отивам да направя сега е конфигурирате моя уеб приложение, така че знае как да се свърже с базата данни, и това, отново, е нещо, което ще трябва да направите, с всички уеб приложения. Вие трябва да го кажа, потребителското име и паролата и името на базата данни и така нататък и така нататък да разбера как всъщност да се свържете с вашата база данни. В Kohana, ние имаме нещо, наречено модул база данни, и в папката конфигурация имаме тази папка, наречена база данни, и както можете да видите, че има един куп настройки, които трябва да зададете тук да го каже какво е потребителското име и паролата за базата данни, така че аз всъщност може да се свърже с него. И тъй като аз не искам вие действително да знаят потребителското име и паролата на моята база данни, Имам един файл, в който аз вече всичко се създаде, и аз отивам да го копирате и поставите отново. Awesome. Добре. Мисля, че това е всичко, конфигурацията трябва да направя, но нека да видим. Ние ще продължим да работим в нея, и ако нещо се срива, тогава ние ще го оправя. Сега това, което аз ще направя, е, че аз отивам да се създаде нов контролер. Или всъщност, съжалявам. Първо трябва да се създаде нов модел. Ще се създаде нов модел, наречен Post.php, и това, което ние ще направим е, че ние ще го наричаме клас Model_Post. Вземи някои оцветяване на синтаксиса за, и така, когато казвам, "се простира ORM," това е основно някои по-обектно-ориентирано програмиране, което за съжаление вие ​​момчета не са се научили в CS50 още, но това е доста лесно да се вдигне. Тя ми дава всичко това на допълнителна функционалност, която идва в този ORM пакет, и така да получа един куп допълнителни функции и какво ли не безплатно, които ще видите малко в секунда. Точно сега всъщност всичко, което трябва да направите е да създадете този клас. Дори не е нужно да правите всяка функция или нещо подобно, но аз създадох един клас, който представлява таблица, и защото съм удължава този ORM клас, Аз получите куп неща безплатно, така че за сега не е нужно да се създаде нещо по-нагоре. И сега това, което аз ще направя, е, че аз отивам да се създаде нов контролер, което аз отивам да назовем blog.php, и аз отивам да копирате върху Welcome контролера така че не е нужно да се пренаписва някои неща, и сега ще трябва да преименувате тази. Сега това, което аз ще направя, за да се тества, за да се уверете, че всичко работи навън, Отивам да грабне първия пост от моята база данни и отпечатване на тялото на поста на екрана. За да направите това, което аз ще направя първо се Отивам да спаси постовете до променлива, така това, което ние ще направим, е - в Kohana това, което правите, е да вземете мнение обекта Малко е тромава, но вие трябва да направите това нещо, наречено ORM :: фабрика, и след това да премине в името на модела, който искате, и го връща на ORM обект, който представлява този модел. И тогава, както казах, когато се простира на ORM обекта, ние да получите всички тези методи за свободен, така например, получаваме тази нова функция, наречена "намери всичко" които автоматично се връща всеки един пост в базата данни, което е доста удобно. И сега в тялото Отивам да се върне първия пост и връщане на тялото му. И разбира се, че трябва да се създаде мнение, така че нека да вмъкнете нов пост. Ще кажете: "Brandon, първия ми пост." Awesome. И сега ние ще отидем в блогове и ако всичко работи добре - О, това е отново нещо друго тъпо разрешение файл. Задръжте на 1 секунда. Това е нещо абсурдно. Ето. Добре. Оправих че разрешение проблем. Той се опитва да създаде някои файлове и някои дневник, и разрешенията, отново, не са били правилно определени, така че аз го направи така че тези файлове са записваеми и изпълними така че в действителност може да влезете, за да неща. Сега тя ми дава друга изключение поговорка, "клас ORM не е намерен" и това е, защото аз забравих още една стъпка. Това е много лошо. В досието на фърмуера папка, там са тези модули тук, които можете да изберете да разрешите или забраните. Това са един куп различни функции, които можете да изберете да използвате в рамките на Kohana, която е нещо хубаво. Например, те имат модул за удостоверяване които можете да използвате за установяване автентичността на потребителите. Те имат модул за кеширане, ако искате да се приложат някаква кеширане задния край, за да работи с приложения по-бързо и какво ли още не. Трябва да се даде възможност на базата данни и модула ORM, защото както казах, ние сме използване на базата данни, очевидно, и ние също трябва да се даде възможност на модула ORM, защото ние бихме искали да има допълнителна функционалност, която е хубаво да има. Всичко, което трябва да направите е разкоментирайте тези две линии, и сега, ако аз освежи, тя ми даде друга грешка. Той казва, "Class Model_Post не е намерен." Сега това е един добър проблем да има. Нека да видим. Направете го публично. Не. Задръж. О, скъпа. Аз не знам защо тя не е в състояние да намери това. Това е наистина странно. Аз имам този клас точно тук. Предполагам, че може да се наложи да - о. Аз съм толкова тъпа. Забравих да добавите таг PHP. Ето защо. Сега аз трябва да отмените, че една промяна аз просто го направих. Добре. Ето. Това беше наистина глупаво. Аз не са имали отвор PHP таг. Но както можете да видите, сега тя работи правилно, нали? Ние имаме едно мнение. Ние грабна първия пост, а сега ние отпечатани тялото му. Чудесно. Fantastic. Всякакви въпроси досега? Nope? Някакви въпроси? Добре, така че ние просто се създаде постът модел, много основни, и ние ще добавим някои функции по-късно. Можем да добавим валидиране и филтриране. Validations са едно от нещата, че рамки за решаване, което наистина, наистина добре, и аз не мисля, че вие ​​трябва да направите това за вашия CS50 PSET, но ако го направите уеб програмиране за своя окончателен проект, Ти си вероятно ще искате да направите някаква валидация, като не се налага празни потребителски имена, може би има парола с поне някаква дължина, такива неща. И това е наистина тромава за изпълнение на тези неща от себе си, и почти всяка една уеб рамка го прави за вас и ви позволява да го направи в много чист начин. И моделът е мястото, където обикновено се изразява тези правила за проверка, защото това е утвърждаване дали даден модел е валиден или не. Но за сега, отиваме да се сложи, че докато по-късно, и за сега ние ще работим върху друга част, и ние ще се опитаме и да направи нов поглед който изброява всички постове. На участващите в изграждането на нова дейност за включване на всички постове стъпки е да вземете списък на всички постове и след това да направи списък на всички постове чрез оглед. Точно тук, достатъчно щастие, ние вече грабна всички постове използването на тази първа линия, да намерите всички функции, и сега това, което ние ще направим е толкова далеч Аз бях пряко определяне на тялото на отговора чрез преминаване на низа, но сега искам да използвам оглед, и разликата между цел и просто правиш това е с цел да имам хубава, голяма HTML шаблон, и това, което мога да направя е да го някои променливи премине и след това са на мнение, автоматично попълване на своя шаблон използване на тези променливи. Това, което аз ще направя е, че ще се създаде нов изглед, и аз ще назове оглед нещо като "блог / форум" и аз отивам да се свързват основно това - ох, какво съм седнал да пиша? Мозъкът ми е някъде другаде. Отивам да се обвърже постовете променливи на становището, така че по този начин мнението има достъп до този пост променлива. И така, сега аз трябва да се създаде тази гледна точка, така че тук имаме тази папка, наречена "възгледи" и на първо място, аз отивам да се създаде нова папка в която се нарича "блог". Това е хубаво. По този начин ние можем да имаме хубава йерархия за нашите възгледи. И тогава аз отивам да се създаде друг файл там, наречена "index.php." Awesome. Всъщност, нека да ги двамата имаме тук. Осъществяване на файл мнение е вероятно най-простата част от всичко това, и това са неща, вероятно вече сте запознати. Отиваме да направим нещо наистина проста, начало казва: "Моят списък с публикации в блога." Тогава ще можем да преминем, и ние можем да превъртите през масива мнения, вземете всеки един пост и да каже нещо подобно - може би добавете ред и след това да отпечатате от автора и тялото. Това има смисъл досега? И нека да видим дали тя работи. Нищо не се случи. Чудя се защо. О, аз пропуснах една стъпка. Много глупаво от моя страна. Аз създадох оглед, но не е посочил мнението като отговор, така че трябва да направя едно още нещо. Трябва да се направи "това тяло отговор" и да го настроите да се изгледа. Ето. Ние имаме нашата позиция, и тогава ще имаме мнение, и само за ритници, нека да вмъкнете друг пост така че ние може да видите списък. И поставете тези две длъжности, и сега, ако аз опресняване на страницата, ние виждаме всички тези мнения тук. Това прави ли смисъл досега? Да, един въпрос? О, добре. Както можете да видите, ние сме били в състояние да се разделят всички тези кодове от на различни раздели, и след това можете да видите, че е най-ясно с кода на оглед. Този файл тук, която представлява мнението, тя се грижи само за представляващ данни, показване на данни. Той получава премина някакъв вид данни, и всички го прави е просто да ви го покажа. Във всички останали части от кода си, няма да се налага да се притеснявате за нищо от това, и по същия начин, мнението Ви код не трябва да се притеснявате за нищо как да получите достъп до базата данни и така нататък и така нататък, което е наистина добра и прави кода много по-възможна за поддържане. Както казах, гледка, те са динамични в това това е един файл, но това ще генерира различни гледни точки на базата на променливите всъщност преминават през, и освен това, има много различни помощни функции , които можете да използвате, за да ви помогне да напишете кода си по-бързо, които аз ще ви покажа само за секунди. Да. [Student] Така че $ 0 е контролер, нали? Това второто нещо. Въпросът е е $ 0 контролер? $ 0 е променлива съм създал тук. За първи път е създаден оглед. Аз го определя на някои променливи. Тогава той премина в тази функция, задайте го, тъй като тялото на отговора. Това прави ли смисъл? [Student] Така е оглед :: фабрика, е гледка като клас или библиотека [недоловим] фабрика функция? Става въпрос за функцията оглед :: фабрика, и в общи линии това е някакъв по-обектно-ориентирано програмиране същество. View е класът на оглед, и тя има метод, наречен "Фабрика" и това е начин да вземете обекта, който е наречен "блог / форум." И това е малко по-обектно-ориентирано програмиране неща че аз няма да отида в тук твърде много. Сега очевидно, искаме да създадем нови мнения, но ние не искаме да се наложи да го направите чрез база данни, така че ние ще се създаде ново действие за създаването на нов пост, и има много неща, които трябва да направите. Първото нещо, което ще направим - нека да се справи с тези неща, един по един. Първото нещо, което ще направя е, че ние трябва да се създаде форма за вмъкване на нов пост, но аз също ще добавим нови действия на първо място, така че добавянето на нова дейност е също толкова лесно, колкото добавяне на нова функция с вашия контролер, и за сега аз ще направя нещо много основно, Просто вземете този възглед и да го качи, просто го покаже за вас. И тогава сега аз отивам да създадете нов изглед на файла, и аз отивам да започнете да пишете някои неща. Какво е хубаво за Kohana е, че те осигуряват много различни функции, помощни за да можете да пишете код оглед по-лесно, и един от тези помощни функции или помощни модули е около написването форми. За писане на форми, аз наистина не са директно да пиша HTML себе си. Вие, момчета, са написани на HTML форми. Знаеш ли как тя може да бъде много, много болезнено и тромаво да пишат форми. Това не е забавно, така че за щастие, в общи линии можем да напишем форма чрез използването на Kohana образуват помощни функции, за да го направи за нас. Отиваме основно трябва полета за всяко едно нещо, което имаме, така един за автори и един за органите. Отиваме да имат етикет, и ние отиваме да имат принос. И накрая, ние ще имаме подаване. И както можете да видите, това е много по-чист, за да напишете от всички, които разхвърлян HTML, което е един вид на хубаво. Разбира се, има и други уеб рамки, които имат дори по-чиста от тази, но поне това е по-добре, отколкото с писане на HTML себе си. Awesome, така че това е това, което виждате. Това е вид на разхвърлян, така че аз отивам да добавите нов ред има да се направи, че изглежда малко по-хубав. Е, разбира се, тя все още изглежда много, много лошо, но ние просто се фокусира върху функционалността за сега, а не на естетиката. Няма време да се направи всичко. И както можете да видите, сега ние имаме супер-основната си форма, Което е доста хубаво. Този код бих казал, е по-чист, отколкото се опитва да напише HTML формират себе си, така че това е хубаво. Каква е следващата? Сега ние трябва да правим неща с действието. Нормално е, когато пишете HTML форми, трябва да го кажа къде отива да подаде формуляра. По подразбиране в повечето уеб рамки, го представя точно същия URL адреса на, така че работата е там, ако ви изпрати запитване за да стигнем до / блог / нова, тя трябва да ви покаже формата, но ако изпратите запитване пощата / блог / нова с данните, тя всъщност трябва да се опита да спаси този пост и да направим нещо с него. Това, което ще направя, е в общи линии всичко, което трябва да направите, за да се провери дали това е искане мнение или искане за GET е да се провери какви са публикувайте променливи които можете да зададете. И ако след променливата е зададен, тогава ние ще се опитаме и ще създаде нов пост. Отново, ние просто правим това, и че създава нов пост, и ние сме буквално ще настроите полета си по този начин, и след това отиваме да го спаси. И тогава аз отивам да се пренасочи към началната страница, така че те могат да видят нашия списък на длъжностите отново. Нека да опитаме това. Ще кажете: "Brandon" и след това да представи на поста, и ако всичко върви добре, както можете да видите, това ме пренасочени към страницата на индекса, и ако превъртите до дъното, имаме нововъведеният пост. Ура! Да, въпрос. [Student] Ами ако беше влязъл точно същото нещо Въведеният от вас преди? Има ли проверка, за да се уверете, че не сте се дублира същото представяне? Бъдете по подразбиране, не, защото по подразбиране - Съжалявам, че въпросът е, ако сте въвели в точно същите данни под формата и представя, че ще го ви позволи да вмъкнете дубликат обект, дублиран запис, по същество? Точно сега, да, тя ще ви позволи да направите това, защото в базите данни, че е перфектно пригодена да имат напълно дублиращи се редове, но ако това е проблем, след което можете да добавите валидиране, например, за да сте сигурни, че ако това е точно същата като на нещо, което вече съществува, след това казват, че това е невалиден обект, и тогава дори можете да посочите вашето съобщение за грешка и да кажа, "Invalid защото това вече съществува" или нещо подобно. Но в този случай, мога просто да се създаде нещо дубликат. Сега нека да се опитаме и да добавите някои потвърждения. Проблемът с това точно сега е, че Бих могъл буквално да представи напълно празен пост. Мога да натиснете този бутон, точно сега, и там да отидем. Вие наистина не може да го види, но този допълнителен ред тук показва, че аз буквално има нов пост. Тя просто има празно автор и празна тялото, и ние не искаме да се даде възможност на хората да правят това. Това е мястото, където валидиране идва инча Мога да отида да ми обектен модел, и сега мога да добавя нова функция, която определя какво утвърждаване правила, че трябва да се добавят към този модел да се уверите, че то е валидно или да се уточни какво значи да бъде валиден мнение? И искам да кажа, че е само валиден пост, ако и двете автора и тялото не са празни, и това е начина, по който го направи в Kohana. Можете да създадете нова функция, наречена "Правила" и след това основно се връща асоциативен масив , който определя правилата за проверка за този обект. Отиваме да се върне на масива, а след това, което ще направя, е казват "автор", тя отива към масив, който отива в друг масив наречен "не е празна." И тогава аз ще кажа "тяло". Добре, и синтаксиса за това и структурата за това Може да изглежда малко по-тромава и малко по-сложно. Ако прочетете документацията, това е доста лесно да разбера, Но по същество това е, което трябва да направите, за да определите някои правила за проверка, и там са много различни правила че Kohana ще ви даде безплатно, като можете да добавите правила, за да се каже, тя трябва да е най-малко тази дължина. Може би това трябва да бъде числов. Може би това трябва да бъде алфа цифров. Може би това трябва да бъде най-много тази дължина, така нататък и така нататък. Има много различни правила, които Kohana осигурява за вас, и можете да отидете на сайта им, погледнете документацията, и можете да видите всички различни неща, които можете да направите. Но това е всичко, което трябва да направите, а сега нека да видим какво ще се случи ако подам празен пост. Какво ще се случи? О, не, аз получите съобщение за грешка. Получавам изключение на валидиране. Е, това е добре. Той ми каза, че моят модел е невалиден, но аз не искам да се покаже изключение на моите потребители, когато те се опитват да представят нещо невалиден, нали? Искам да им дам някакъв приятелски съобщение за грешка когато нещо се обърка. Това, което ще направя, е, че ще увийте всичко в контур пробвам улов. Всъщност, мисля, че това също е нещо, което все още не сме се научили в CS50, защото C, език за програмиране C на, не разполага с изключения, но почти всеки един друг език има изключения, така че наистина, наистина за кратко, Изключение е нещо, което е част от код, може да хвърли изключение, когато нещо се обърка, но тогава може би някаква друга част от код по-нагоре да хванеш това изключение и да направим нещо с него. Например, в този случай, на част от код, който се опитва да спаси един модел, тя утвърждава модела, и ако той казва: "Добре, този модел е невалиден," че ще се хвърли изключение, и това е нещо, еквивалентен на в C може да се върне -1 или нещо подобно. И тогава за мен, тази функция, моя код на по-високо ниво, мога да се опитам и да хванете това изключение и в общи линии да каже: "Добре, ако аз хвана изключение, какво ще правя?" Или мога да избера да не се хване на това изключение и нека някой по-нагоре хвана изключение, или ако никой не я хваща, След това цялата програма катастрофи и казва: "Нещо се е объркало, и не можех да се справя." Но това, което правим е, че увийте парче код в опитам блок, и след това можете да добавите нещо, наречено блок за улов, която е нещо като код, който ще се опита да хване изключения, които могат да възникнат. И така, ако хванем този специално изключение или обезсилване изключение, а след това, което аз ще направя, е Отивам да се определят грешки - Мисля, че това е начинът да го направя - и аз отивам да се определят грешките на някакъв предмет. И след това, което аз ще направя, е, ако го удари на това изключение, това няма да се пренасочат, и ако той не се пренасочат, то се случва да излезе от, ако блога и натиснете този блог / нова, която се иска аз искам да направя. Ако има грешка, то аз искам да се върна към формата и показва тези грешки. Сега това, което искате да направите, е да искам да премине в тези грешки да изгледа. Добре, аз мисля, че са на мнение, точно тук, и в общи линии искам да показва тези грешки, ако те съществуват. Преди да пишете HTML за това, аз ще съм наистина бързо ви покажа какво структурата на тази грешки променливи прилича, и това е една добра практика като цяло. Много пъти можете да получите нещо в замяна от някакъв метод, някои функции в уеб рамка, и ти не знаеш какво е променлива изглежда, така че не знам как се работи с него. Отивам да се използва метод за печат R всъщност да го разпечатате. И както можете да видите, тя ми казва, че е асоцииран масив, а вие имате ключ, автор, точки за този низ, автор не трябва да е празно, а друг ключ, орган, сочи към друг низ, тялото не трябва да бъдат празни. Аз съм като, добре, добре. След това мога да превъртите през масива и да отпечатате всяко едно послание. Това е основно като асоциативен масив с един куп съобщения. Това, което аз ще направя, е "Ако грешки" и аз отивам да създадете неподреден списък, и аз отивам да превъртите през всички грешки. И това, и сега аз ще се опитам изпращането на това отново, и нека да видим какво ще се получи. Сега получаваме тази хубава списък от грешки, и това все още е доста грозно, но това очевидно може да бъде форматиран, за да изглежда добре, но основната идея е само в рамките на няколко реда код, ние бяхме в състояние да валидира нашия модел, уверете се, че някои области, които не са били празни, и ако нещо се обърка, след това се върнете някакво съобщение за грешка Тогава бих могъл да представи обратно на потребителя. Можете също така да персонализирате вашата валидиране така че всъщност можете да имате съобщение за грешка че е по-специфични за вашата кандидатура или нещо подобно. Всичко, което е общо за персонализация. За съжаление, ние сме изчерпване на времето, така че аз ще трябва да се отреже на живо кодиране сесия тук. Има куп други функции, които аз искам да демонстрира за вас в този пример. Например, можете да добавите шаблони за вашия сайт, така че може би има някакъв вид на HTML код, който искате да приложите към всяка една страница на вашия сайт, и вместо поставяне, че във всеки един изглед файл имате, което очевидно би било лоша практика, По принцип можете да определите тези шаблони, и след това във вашия контролер каже: "Добре, аз съм с този шаблон." "Били ли всичките ми възгледи използват този шаблон." И едно последно нещо, което искам да демонстрира пред вас, както и че ние не разполагат с време за е крос-сайт скриптове, и в общи линии мисля, че вие ​​вероятно сте виждали в CS50 - Мисля, че Дейвид Malan вероятно говори за това как обикновено можете да инжектирате JavaScript код в - Говори ли за това? Може би? Може би не? Но много пъти може да се инжектира зловреден JavaScript код в базата данни на някого, и ако те не избягат, че правилно, тогава, когато те представят тези данни обратно към потребителя, тогава той може да тече някакъв случаен JavaScript код, който не искате да се случи, и щях да демонстрира как ще направи това в рамките на Kohana. Това всъщност е много, много лесно. Мога да го направя точно сега за 2 секунди буквално. Всичко, което трябва да направите, е основно увийте тези неща в това нещо, наречено HTML лица. И това автоматично ще избягат всички герои правилно и се уверете, че не се получи този проблем. [Student] Вие написан първия тест неправилно. [Brandon Liu] О, Опа. Добре, това е всичко, което трябваше да споделя с вас за днес. Тези слайдове ще бъдат публикувани, но като цяло това са единствените ресурси, което наистина трябва да се нуждаят, за да започнете с Kohana. Можете да отидете на сайта. Те имат указания за употреба, и те също имат API Explorer. Ние можем да проучи всички различни функции и помощни функции, които имат за вас. Те обикновено имат достатъчно информация на интернет страницата на , които можете да използвате, за да започнете и да тръгвам с Kohana. Там не са толкова много уроци, мисля, за Kohana, извън това, което те имат на сайта тук, така че това е може би най-добрият ти залог. Но ако искате да отидете с уеб рамка и вие не искате да трябва да вдигне нов език, и искате нещо, което е сравнително лек и има лесен кривата на обучение, Аз определено бих предложил Kohana. Това е вероятно най-добрият принос за това. Смешното обаче е, ако сме използвали Ruby по релси, бихме могли да се повтаря това, което току-що направих а може би и повече в рамките на 3 минути. Не е шега, но изучаването на Ruby по релси отнема много по-дълго от това ще отнеме, за да научите Kohana. Това е в основата на вашия избор на това, което искате да изберете, за да учат, но ако искате да се получи и се изпълняват бързо, Kohana определено е един много добър избор. Някакви последни въпроси, преди да свърши? Да. [Student] Как бихме могли да се интегрират, че в рамка CSS като сте използвали, когато сте се инструктира? Въпросът е как ще се интегрират, че с рамка CSS? Това, което най-вероятно ще направите, е най-вероятно ще включва нова папка, където ние ще зареже всички наши CSS файлове, и след това щяхме да добавите нов шаблон. В шаблона щяхме да включва тези CSS файлове да се уверите, те са еталон на всяка една страница, и тогава, когато всъщност се пише HTML, Вие трябва само да добавите подходящите класове и какво ли не, и например, когато използвате нещо подобно на формата помощник функция, можете да добавите повече от параметрите, след това да се уточни кои класове искате да бъде приложен към различни неща така че те биха могли да го оформите правилно, и това е в общи линии как ще отида. Някакви други въпроси? Awesome. Благодарим ви за отделеното време, и ви благодаря, че дойдохте. Аз нямаше да добавите много много други неща, но една наистина бързо нещо е, че ние не разполагате с връзка на формата. Наистина тъпо. Да добавим - всъщност в изгледа, блог, форум, нека наистина бързо да добавите линк, който отива към нова страница, страницата, на която можем да вмъкнете нов пост. Ние ще направим това. Какво е хубаво е там е цялата тази група от HTML помощни функции което правя различни неща за вас, така че вече видях субектите функционират тук, но те също имат функция, наречена "котва" , които можете да въведете в блог / нова и да кажа, "Задайте нов блог." И това ще създаде тази връзка за вас, и това изглежда наистина тривиално да се направи, но това е хубаво, защото предполагам, че сте се движат вашия сайт от един домейн към друг. А ако просто написах сам адресите, тогава ще трябва да се променят всички URL адреси. Или може би той се премества от една папка в друга папка. Може би трябва да промените всички тези URLs себе си, и че не е забавно. Можете да използвате тази котва точно тук, и можете да промените домейн или подпапка префикс в конфигурационния файл наведнъж, и след това ще се прилага, че навсякъде, и това е, отново, чудесен пример за това не се повтаря себе си, сушене кода си навън. Където и да сте себе си повтаряше, се опита да извлече в някакъв конфигурационен файл или за различна функция и са се справя, че за вас. И най-последното нещо, което исках да ви покажа е Предполагам, че се връщаме на този пост, и аз трябваше съставен някои наистина дълго есе, но аз забравих да включа своя автор. Сега, когато натиснете бутона "Изпрати Post," Току-що загубих всичко. Не! Наистина тъжно. Е, как да се справят с това? Това е, което правим. Това, което правим е тук за тези входни и текст площ функции, ако включим втори параметър, а след това стойността на този втори параметър ще бъде това, което областта ще бъде първоначално населен с. Какво можем да направим, е в нашия блог контролер, ние може да се свърже друга променлива. Наречете го "ценности" може би. И да премине в пост масива, буквално. Това означава, че ако проверката е неуспешна, преминават към мен след масива, който внесох от последното искане, и по този начин мога да използвам стойностите от последното ми представяне да населят полетата. Сега мога да направя нещо подобно стойности автор и стойности на тялото и по този начин сега, ако аз правя някои случайни неща и натиснете бутона "Изпрати Post", тогава той остава там. Но ние ще се сблъскате с друг проблем. Това работи, но ако отидете на страницата за първи път, тя ще се срине, а това е така, защото за първи път ние отидете на страницата, този пост променлива още не е определена. Това е нищожна. Той не съществува. И това, което искам да кажа е, че ако съществува такъв ключ, след това се върнете стойността на този масив, но ако ключът не съществува, след това се върнете празен низ. Това е функционалност искаме тук. Искаме да се провери дали съществува ключа преди да се опитате да получите достъп до масива, и достатъчно щастие, Kohana също ни дава функция помощник за това. Те имат целия този набор от функции под ARR име, съкратено от масив, и те имат една функция, наречена "да" и вие може да премине в масива, и вие може да премине в името на ключа. След това в общи линии това, което ще направим е, че ще се опита да получи този ключ, но ако този ключ не съществува в масива, След това тя ще се върне празно, или ние можем да посочите по подразбиране, аз вярвам, което е хубаво. Сега, ако ние правим едно и също нещо отново, След това, което виждате сега тя работи още от първия път, и отново, ако напишете в някои случайни неща и да се опитаме и да представи, след това той остава там. И аз предполагам, че може да ви покаже как да добавите шаблон наистина бързо. Какво можем да направим първата е, че ние може да добавите нов изглед, наречен "template.php" в папката Прегледи, и това, което аз ще направя, е, че аз отивам да разпечатате нещо, наречено "съдържание" която ще бъде основната ми съдържание. И може би най-отдолу Отивам да добавяте, да речем, авторското право. [Недоловим студент въпрос] [Brandon Liu] Може би това е супер основния шаблон Искам да използвам. Аз искам да имам папка с моя авторското право на всяка една страница, и сега какво ще правя в рамките на моя контролер Сега е вместо да каже, "разширява Controller" Отивам да се каже, "се простира Controller_Template" и сега вместо да каже, "орган отговор е равна на тази гледна точка," Отивам да се каже, "Това съдържание е шаблон -" и аз мисля, че - да поставя знак за равенство? Забравям. Да, така си и мислех. И сега настроя тази променлива съдържание да се равни на гледката. Мога да направя същото тук. И сега, ако съм на опресняване, можете да видите сега това авторското право се добавя там, и просто да направи някои случаен пост, и след това, отново, трябва да видите, че авторското право е най-долната част на страницата. Great. Това е всичко, което исках да ви покажа момчета. [Аплодисменти] Някакви въпроси? [CS50.TV]