[Seminarium] [Kohana: En lätt PHP Framework] [Brandon Liu] [Harvard University] [Det här är CS50.] [CS50.TV] Hej alla. Mitt namn är Brandon. Jag är en junior här på högskolan gör datavetenskap, och i dag ska vi prata om Kohana, vilket är en PHP ramverk webbutveckling. Idag kommer att bli en levande kodning seminarium, så jag i princip kommer att spendera 5-10 minuter att förklara vad Kohana är, och då jag bokstavligen ska bygga en super enkel blogg för dig just här bokstavligen från grunden. Vi ska hämta koden från Kohana hemsida, och vi kommer att börja bygga en blogg, och förhoppningsvis kommer att bli mycket lärorikt, eftersom du ser kanske kanske jag ska göra några misstag, och du ser mig återhämta sig från dem, eller du ska se min tankeprocess som jag bygger genom denna blogg, och under tiden får du också bekanta dig med själva ramverket. Förhoppningsvis ska det vara en mycket lärorik övning. Först, vad är ett ramverk? Om du har tagit CS50 så långt, har du inte riktigt fungerat med någon ramverk ännu, och saken är den här. Du har säkert gjort 1 webbutveckling pset redan, och låt oss säga att du fortsätter att bygga webbplatser och hålla bygga webbplatser. Du kommer att börja märka ett par saker. Det första du kommer att märka är att du förmodligen gör samma saker om och om igen hela tiden, saker som städning användar indata, saker som att organisera dina filer på ett visst sätt. Den andra saken du kommer också förmodligen att märka är att din kod kanske börjar bli väldigt, väldigt rörigt, och du kan lämna det rörigt och bara ha mycket svårt att upprätthålla den, eller så kan du börja strukturera din kod och göra den modulära på vissa sätt för att göra det mer utrymme för detta. Det är där webbramverk i grunden kom i. Dessa människor som hade byggt en hel del webbplatser, sa de, "Vi behöver inte göra om detta varje gång vi bygger en webbplats." "Varför inte bara göra ett paket som gör alla dessa saker för dig varje gång du vill bygga en hemsida? " Och så att när du gör en ny hemsida, du bara fokusera på exakt vad denna hemsida handlar om. Du behöver inte upprepa alla de olika konfiguration och separering av koder och skriva om kod att du ofta måste göra när du gör hemsidor. Tanken är att en ram kan du skriva en högre nivå kod utan att behöva oroa sig för lägre nivå detaljer. En lägre nivå detalj kan vara något liknande behandlar rengöring användarinmatade data. Det är något som du egentligen inte ska behöva oroa sig för. Du bör fokusera på vad din webbsida tilldelningen egentligen handlar om. Den eliminerar många av standardkoden. Det är en arkitektur för ditt projekt. De mest populära man skulle vara Model-View-Controller, som jag kommer att prata om i en sekund. Och många gånger dessa ramar förkroppsligar en rad förfaranden, regler och bästa praxis för dig att använda så att när du anta ramen webben du måste skriva din kod på ett visst sätt, och det är i allmänhet en överenskommen uppsättning principer av samhället som är allmänt accepterat att vara ett bra sätt att skriva kod. Det gör koden mer att underhålla, mer användbart, så vidare och så vidare. Och slutligen, det jag vill betona om ramar kontra bibliotek är denna idé om inversion av kontroll, och saken är den här. Skillnaden mellan ett bibliotek och en ram är att med ett bibliotek du fortfarande skriva huvudprogrammet, och du är sorts åberopa biblioteket och uppmanade biblioteket för att göra något för dig. Skillnaden mellan ett bibliotek och ett ramverk är att ramen börjar med kontrollen, och det åberopar din kod, så att du kan se det som - det är därför det kallas en ram - ramarna ger denna ram och struktur för din kod, och du fyller i hålen, och detta kommer att bli mer uppenbara i en andra när du ser mig börja skriva kod i samband med ramarna. Du ser att jag fyller i luckorna, och ramen är typ att styra alla rörliga bitar, och jag måste sätta bitarna på rätt plats. Idag ska vi prata om Kohana, som är en av många PHP ramar. Det finns webb-ramar, och det finns de i nästan varenda språk, och jag plockar Kohana eftersom Kohana är utan tvekan och allmänt erkänd som den enklaste PHP ram för att plocka upp. Det är den mest lätt. Det finns andra där ute som kommer med många, många fler funktioner, men de tenderar att vara svårare att plocka upp. Och slutligen, använder Kohana MVC arkitektur. Det är lätt nog att vi bokstavligen kan bygga ett projekt här mitt framför dina ögon, och du kan ganska mycket följa med ganska lätt. Vad är MVC-arkitektur? Det står för Model-View-Controller, och kanske om du tycker om den koden du har skrivit hittills för en del av din webbutveckling psets du kanske kan se en del av detta, men oftast när du börjar skriva en mer komplex webbapplikation, fördelningen mellan dessa tre segment blir mer och mer uppenbart. Jag lade ut MVC här typ av som en skorsten, och ofta du kommer att höra folk prata om travar i webbutveckling, och detta är för att illustrera idén att varje lager, varje komponent försöker verkligen att bara kommunicera mellan 2 andra komponenter. Någon besöker din webbplats som en klient eller en webbläsare. De interagera med ditt program genom utsikten koden. Utsikten koden samverkar med styrenheten. Regulatorn interagerar med modellen, och modellen interagerar med SQL-databas. Och det finns inget hoppande i mellan om du skriver din kod ordentligt. Vad gör dessa saker gör? Modellen är i huvudsak bit kod som behandlar dina data. Allt som handlar om din databas, med de objekt som du lagrar, eller hämta dessa objekt i databasen, det är allt hanteras av modellen. Kanske du har objekt i databasen. Vi kommer att skapa en modell som har att göra med inlägg, så ett inlägg kan ha vissa attribut till det. Du kanske har funktioner kring lagra dessa tjänster eller hämtar inlägg eller filtrering av inlägg och så vidare och så vidare, och det är all kod som är hanteras av modellen. Regulatorn är en slags programlogiken, och en massa olika saker som kan gå i programlogiken. Om du pratar med en annan API, som kan vara där du arbetar med programlogiken. Om du försöker få att ta in data från flera olika modeller och har att kombinera dem på något sätt, som ofta kan hanteras av styrenheten. Till exempel, på Facebook, om du vän någon, då kanske att agera av att fastställa att relationen kan utföras av styrenheten. Och slutligen, är uppfattningen den kod som har genere vad du faktiskt ser. Många gånger tror jag i CS50 psets de inte verkligen uppmuntra er att skilja dessa tre saker. Du kommer förmodligen att ha denna stora, långa filen där i toppen du göra några SQL-fråga och kanske göra en del bearbetning på de uppgifter du hämtas från databasen, och då har du alla dina HTML längst ner. Och du kanske upptäcker att när du skapar fler och fler sidor att du kommer att ha en del kod upprepning, och även, saken är din fil blir riktigt stora och långa och blir otymplig att hantera. Anledningen till MVC är så väl betraktas är för ett antal skäl. Det första är något som kallas separation av oro vilket är tanken att när du har - idealt 1 bit kod bör göra 1 sak och gör det riktigt bra, och du bör inte kombinera bitar av kod som gör disparata saker. Till exempel, se kod och modellkod, De har egentligen inte vara relaterade. De behöver inte vara i samma filer, så när du kan, skilja ut dem så det är lätt att underhålla. Den andra saken är återanvändning av kod. Du kan hitta dig själv att skriva samma SQL-fråga eller gör liknande frågor som kan abstraheras till 1-funktion, och det är tanken bakom modeller och styrenheter, att ha den i en separat funktion som du kan återanvända på olika platser i ditt projekt. Och slutligen, som är knuten till att torka din kod, eller inte upprepa dig själv, inte upprepa dig själv. Detta är mycket förståeligt i utvecklingen. När du kan, du vill inte upprepa dig själv, för om du upprepa dig själv,  det är mycket dyrare att underhålla. Om du vill ändra en sak, måste du ändra det överallt, och som leder till fel, och det är hemskt. Okej. Har du frågor så långt om Kohana alls? Bra. Nu ska vi dyka in i live-kodning session, och förhoppningsvis allt går bra. Jag kommer att i grunden bygga denna webbplats på en av mina fjärrservrar, och på det sättet ni kan också se hemsidan och få tillgång till webbplatsen, och även miljön är bättre konfigurerad än min avlägsen maskin, eftersom det körs Linux istället för OS X. Vi bokstavligen kommer att starta. KohanaFramework.org. Jag ska hämta koden från webbplatsen. Jag kommer att kopiera adressen, gå till min server, ladda ner den, och jag kommer att extrahera den. [Student] Vad är det största du kan göra texten? [Brandon Liu] Är det bättre? [Student] Är det genomförbart? [Brandon Liu] Ja, det är bra. Jag laddade ner en ZIP-fil och uppackade det i en katalog som heter Kohana, och vi kommer att byta namn på den CS50-Kohana, och låt oss gå i. Awesome. Här ser du en massa olika filer. De flesta av er kan ignorera - Vi är inte kommer att gå igenom varje enskild fil som är här inne på grund av vår tidsbrist, men i allmänhet när du installerar Kohana, det första du gör är du går till katalogen, och du i princip göra vissa miljötester och whatnot att se till att din omgivning är korrekt inställd på att köra Kohana och se till att allt är okej. Du kan se det mesta gått, men generellt du alltid stöter på detta 1 problem där man klagar över att någon katalog är inte skrivbar, och det är på grund av vissa behörigheter. Jag vet inte hur mycket ni har lärt sig om filrättigheter i CS50, men om du gör webbutveckling, du kommer att stöta på denna fråga en hel del. Jag kommer att göra den skrivbar och jag tror att jag måste också - där vi går. Okej, så nu kan du se allt gått, och nu kommer det att berätta för dig att byta namn på filen install.php. Jag kommer att flytta filen install.php att installed.php, och nu om jag uppdaterar, det ger mig lite fel, och det är där felsökning kommer in Det är här du kan se vad som egentligen kommer att hända. Saken är den, som standard, antar Kohana att ditt projekt är i rotkatalogen på din domän, så det förväntar dig att vara på demo.brandonkliu.com. Vi måste säga det att det är faktiskt i en undermapp. Det är i en undermapp som heter CS50 Kohana. Saken är den, det är misstolkar CS50-Kohana som något annat, som jag ska förklara för dig i en sekund. Men jag ska säga dig att det är något som är att vänta. Vad vi ska göra är att vi kommer att gå in i denna mapp som heter bootstrap.php, vilket är konfigurationen mapp där en massa olika saker sätts upp. Jag öppnar det upp. Då kanske en av de första sakerna jag ska göra är att ändra tidszon. Och sedan ska vi se. Aha! Just här. Det finns en massa olika konfigurationstalesätt i här, men det jag letar efter är denna sak kallad bas-URL, och som standard jag får det satt till Kohana, men jag ska ändra det till CS50-Kohana, och jag tror att det skulle fixa det. Ja, bra. Som standard, för att se att det fungerar, det står, "Hello World". Var kom det ifrån? Hur kom vi till Hello World? Var exakt är den kod som faktiskt skrev det? För att förstå det, kommer jag presentera detta koncept som kallas routing. Ganska mycket alla webbramverk har konceptet kallas routing, vilket är den del av programmet som kommer att kartlägga en viss webbadress till en viss bit kod i din ram. Till exempel, om du har någon webbadress och du går till en viss webbadress som foo.com / blog / all vad ramarna kommer att göra - eller åtminstone vad Kohana kommer att göra - är att det kommer att hitta en klass som heter styrenhet blogg, och det kommer att köra den funktion som heter action. Jag vet att jag talar om klass och funktioner, och jag vet att ni har inte täckt klasser och funktioner i CS50 ännu, men för nu, du kan tänka på klasser som bara en grupp av funktioner, ett sätt att gruppera funktioner tillsammans. Det är egentligen allt du behöver veta. Nu om vi tittar på vår mappstruktur, i programmappen finns en annan mapp som heter klasser, och de andra mapparna kallas Controller och modell. Om du tittar in i Controller-mappen, Vi ser att det finns en fil som heter Welcome, och du kan se här är en klass som heter Controller Välkommen, och det finns en funktion som heter åtgärd Index, och vad den gör är det sätter kroppen av din reaktion på Hello World. Det är där koden skrivs. Den andra frågan är, ja, jag gick inte till bla, bla, bla, / welcome / index. Hur hamnade jag här? Tja, det är helt enkelt därför att Här längst ner på vår bootstrap-fil där vi satt våra vägar du kan se att de sätter vissa standardinställningar för dig. Standard styrenhet är Välkommen. Standardåtgärden är index. Det är därför när vi satte ingenting i det automatiskt gick till Välkommen controller och index åtgärd. Allt vettigt hittills? Nu kan du göra mer än att bara gå till Controller och en särskild åtgärd. Du kan också skicka in parametrar till regulatorn. Bara som ett exempel, Jag kommer att lägga till ytterligare åtgärder för att denna regulator visa. Låt oss kalla denna åtgärd Echo, eftersom det kommer att berätta för dig vad du ger det, och så jag i princip kommer att ta en parameter som kommer att skickas till mig till routingprogrammet, och som ni kan se här, denna linje här, kan du se att Detta innebär i princip att du har controller, och du har en /, och du har handling, och du har en annan /, och det kommer att bli parametrar, och för att vi har detta namn ID inom vinkelparenteser, innebär att att vi namnge denna parameter-ID. Senare i min controller kod om jag vill ta tag i denna parameter, Jag kan använda koden jag skrev, hitta den parameter som heter ID. Det är vad jag gjorde här, och jag kommer att gå tillbaka och säga, "Du sa" det. Och så nu, om jag går till vår hemsida, Jag går till cs50-kohana/welcome/echo/Helloooo-- åh, det stämmer. Det finns 1 steg jag lämnade ut. Detta är en del av den levande kodnings idé. Här är en sak. Låt oss se. Så normalt som standard med en hel del av dessa webbapplikationer du måste inkludera denna index.php sak i din webbadress, eftersom tanken är index.php är en slags inkörsport av din ansökan, men naturligtvis, det är typ av irriterande att ha. Du vill inte ha index.php visas i din webbadress, och ganska mycket varje webbramverk ur lådan har detta index.php problem, och så du måste vidta vissa åtgärder för att kunna ta bort det. Och så i detta fall, vad vi ska göra är att vi kommer att använda en fil som heter. htaccess, och detta är något som är specifikt för webbservern Apache, och det kan göra saker som att skriva om adresser och omdirigera webbadresser och så vidare och så vidare, och Kohana är tillräckligt bra för att ge en mall. htaccess-fil som vi kan använda. Som ni ser, det finns en fil där som heter example.htaccess, och vi kommer att kopiera det till. htaccess. Jag kommer att öppna denna och redigera den, och i princip det gör en massa olika saker. Nyckeln linje du kanske vill titta på är här. Tanken är att detta sätter upp en regel som säger, "Okej, vad du än skriver in, prepend index.php till det." Du kan se det. Den. * Står för någonting, matcha vad som helst, och sedan den andra delen är index.php / $ 0, och $ 0 hänvisar till vad som tidigare matchas. Låter det vettigt? Men det riktigt viktig sak jag vill ändra på är att ändra detta omskrivning bas, vilket är den URL-basen. Det förutsätter slags där du arbetar från. Jag kommer att lägga CS50 Kohana till det, och på det sättet nu, om jag tar bort index.php, det borde fungera, och jag kommer att lägga till några siffror visa att det verkligen fungerade. Låter bra. Några frågor hittills? [Student] Hur har det vet att göra 123? Är det ett argument? Exakt. Du kan tänka på det precis som ett argument. Men det konstiga är dock att det sätt Kohana gör det är de inte gör det precis som ett argument. Du måste ta tag i det så här. Du måste ta tag i begäran objektet och be om den parameter som är uppkallad ID, och det namnet ID kommer från att bootstrap-fil som jag visade tidigare, och namnet ID var i dessa vinkelfästen, och det är hur du tar tag i dessa parametrar. Awesome. Fler frågor? Som jag sa, controllers, hanterar de programlogik, så det är en instans där man kan se that - det är mycket grundläggande, men det är fortfarande programlogik, tanken på att ta tag i parameter och skapa en ny sträng som säger, "Du sa bla" och sedan spotta det tillbaka till dig. Och i allmänhet vad du gör är att du skapar olika styrenheter. Du skapa separata regulatorer för olika delar av din webbplats. I dag ska vi göra en mycket enkel hemsida, och det kommer att bli en mycket grundläggande blogg. Vi kommer att göra en ny styrenhet bara för inlägg i en blogg. Men sedan om jag skulle också lägga till kommentarer till blogginlägget, då skulle jag nog vilja göra en ny styrenhet för dessa synpunkter. Om jag vill lägga till användare, skulle jag antagligen lägga till en ny styrenhet för dessa användare, och i allmänhet, är tanken att varje gång du har en ny modell, ett nytt dataobjekt som du arbetar med, du har en enda styrenhet för den dataobjekt. Idag ska vi bara kommer att arbeta med en dataobjekt, och det kommer att bli inlägg, och även du kan tänka på dataobjekt som motsvarar tabeller. Generellt varje tabell motsvarar 1 typ av dataobjekt, så efterbordet kommer att ha 1 inlägg modell, som kommer att ha en efterstyrenheten som motsvarar denna, och samma för kommentarer, samma för användarna, och så vidare och så vidare. Och det är en allmän tumregel. Det kommer att finnas särskilda fall där man kan skilja sig från det, men 90% av den tid som är vad du ska göra, och jag ska visa dig att det är vad vi ska göra i dag. 1 mer koncept innan vi dyker tillbaka in koden, denna idé om objektet relationell mappning. Ni har redan gjort en webbutveckling pset, och du har sett att du gör en SQL-fråga, och vad det tillbaka till dig är rader. Du får dessa rader, och du indexera dem av några namn, namnet på kolonnen och bordet, och det är hur man jobbar med det, och det kan vara lite besvärlig. Men dessutom, om du har relationer inom databasen, som till exempel om jag har synpunkter och inlägg, då kanske jag vill ta den överordnade posten som en kommentar. Om jag använder bara rader i SQL, så allt jag kan få är ID av den överordnade posten och inte själva inlägget i sig. Men när vi är kodning, vad vi egentligen vill är att faktiskt ta tag i  föräldern lägga sig ibland. Vilka objekt relationell mappning gör är det tar resultaten av databasfråga och tar den i objekt för dig, som är mycket trevligare att arbeta med än vanligt arrayer och rader. Till exempel, nu när jag har en kommentar kanske, och jag vill ta den överordnade posten, och jag kanske kommentera pil inlägg, så kommer det att faktiskt ge mig posten objektet som motsvarar den faktiska förälder post, inte bara en del-ID, som jag annars skulle behöva använda och göra en annan SQL-fråga för att ta tag i stolpen, vilket är omständligt och onödigt. Och dessutom, genom att kartlägga alla dessa rader med data till objekt, Du kan också bifoga fler funktioner till objekt, så till exempel, jag pratade om hur klasser är i huvudsak grupperingar av funktioner. Du kan tänka på det viset. Till exempel kanske jag har det här inlägget objektet och kanske jag skulle vilja ha någon form av funktion kopplad till sig som i grunden säger mig var det nyligen postat? Var det postade i förra veckan, sant eller falskt? Och det är en funktion jag kan fästa på det objektet, och det är verkligen praktiskt att ha det på samma ställe, och det finns en mängd olika funktioner som du kan skapa för dessa objekt, och det är verkligen skönt att kunna koppla den till en klass, till ett objekt, medan om du bara hade rader som kommer från databasen, då kan du inte riktigt fästa någon funktionalitet till det. Det är bokstavligen bara data. Eventuella frågor om det alls? ORMS är mycket vanliga webbutveckling, och det finns en massa olika typer av Orms, och Kohana har sin egen ORM. Det är mycket grundläggande, men du får ett smakprov på hur det ser ut. Låt oss skapa en modell för våra blogginlägg, och det första vi naturligtvis måste göra är att skapa en faktisk bord i vår databas för att faktiskt lagra våra data för dessa tjänster. Det första jag ska göra är att gå till phpMyAdmin. Har ni använt phpMyAdmin tidigare? Okej, enormt, så ni vet redan vad det är, och jag kommer att skapa en ny tabell som heter Kohana inlägg, och det kommer att bli väldigt enkelt. Jag blir tvungen att logga in igen Allt vi ska göra i dag är att ha en författare och en kropp, bara hålla det enkelt. Jag kommer att skapa den tabellen, och nu har vi bara ha en tabell som representerar våra inlägg med 2 fält för våra författare och vår kropp. Den andra saken jag ska göra nu är konfigurera min webbapplikation så den vet hur man ska ansluta till databasen, och detta, återigen, är något som du måste göra med alla webbapplikationer. Du måste berätta det användarnamn och lösenord och namnet på databasen och så vidare och så vidare att räkna ut hur du faktiskt ansluta till din databas. I Kohana, har vi något som kallas en databasmodul, och i konfigurationsmappen vi har denna mapp som heter Database, och som ni ser, det finns en massa inställningar som du måste ställa in här att tala om vad är det användarnamn och lösenord för databasen så jag kan faktiskt ansluta till den. Och eftersom jag inte vill att ni ska verkligen känna användarnamn och lösenord på min databas, Jag har en fil där jag redan fixa allt, och jag kommer att kopiera och klistra in den över. Awesome. Okej. Jag tror att det är all konfiguration jag behöver göra, men låt oss se. Vi fortsätter att arbeta på det, och om något kraschar, då vi ska fixa det. Nu vad jag ska göra är att jag ska skapa en ny styrenhet. Eller faktiskt, sorry. Först måste jag skapa en ny modell. Jag ska skapa en ny modell som heter Post.php, och vad vi ska göra är att vi kommer att kalla den klassen Model_Post. Få lite syntaxmarkering på, och så när jag säger, "utökar ORM," det är i princip lite mer objektorienterad programmering, som tyvärr ni har inte lärt sig i CS50 ännu, men det är ganska lätt att plocka upp. Det ger mig all denna extra funktionalitet som kommer i denna ORM paket, och så får jag en massa extra funktioner och allt gratis, som ni ser lite av på en sekund. Just nu faktiskt allt jag behöver göra är att skapa denna klass. Jag behöver inte ens göra någon funktion eller vad som helst, men jag har skapat en klass som representerar tabellen, och eftersom jag har utsträckt denna ORM klass, Jag får en massa saker gratis, så nu behöver du inte ställa in något mer upp. Och nu vad jag ska göra är att jag ska skapa en ny styrenhet, som jag kommer att nämna blog.php, och jag ska kopiera över Welcome controller så jag inte behöver skriva lite saker, och nu måste jag byta namn på det här. Nu vad jag ska göra för att testa för att se till att allt fungerar ut, Jag kommer att ta det första inlägget från min databas och skriva ut kroppen av inlägget på skärmen. För att göra det vad jag ska göra först är jag ska spara inlägg till en variabel så vad vi ska göra är - i Kohana det du gör är att ta tag i inlägget objektet det är lite besvärligt, men du måste göra det här kallas ORM :: fabrik, och då du passerar in namnet på den modell du vill ha, och den returnerar den ORM-objekt som representerar den modellen. Och sedan, som jag sa, när vi utöka ORM objektet, vi får alla dessa metoder för gratis, så till exempel, vi får denna nya funktion som heter "hitta alla," som återgår automatiskt varenda inlägg i databasen, vilket är ganska bekvämt. Och nu i kroppen jag kommer att återvända det första inlägget och returnera sin kropp. Och naturligtvis, jag behöver för att skapa ett inlägg, så låt oss sätta in en ny post. Jag säger, "Brandon, min allra första inlägg." Awesome. Och nu ska vi gå till bloggar och om allt fungerar bra - Åh, det här är en annan dum fil behörighet sak igen. Håll på 1 sekund. Det är ganska absurt. Så där. Okej. Jag fast att tillstånd problem. Man försökte skapa några filer och någon logg, och behörigheter, återigen, inte var korrekt inställd, så jag gjorde det så dessa filer var skrivbara och körbara så det kan faktiskt logga till saker. Nu är det ger mig ett annat undantag ordspråket, "klass ORM hittades inte," och det beror på att jag har glömt ett steg. Det är synd. I bootstrap mappfilen, finns dessa moduler här, som du kan välja att aktivera eller inaktivera. Det är en massa olika funktioner som du kan välja att använda inom Kohana, som är typ av trevligt. Till exempel, de har en autentiseringsmodul som du kan använda för att autentisera användare. De har en cache-modul om du vill genomföra någon form av caching bakdelen för att göra ansökan arbete snabbare och allt. Vi måste tillåta databasen och ORM-modul, eftersom som sagt, vi använder databasen, naturligtvis, och vi måste också göra det möjligt för ORM-modulen, för att vi skulle vilja ha den extra funktionalitet, vilket är bra att ha. Allt jag behöver göra är att kommentera bort dessa 2 rader, och nu om jag uppdaterar, det gav mig ett annat fel. Den säger, "Klass Model_Post hittades inte." Nu är det här ett bra problem att ha. Låt oss se. Gör det offentligt. Nej. Vänta. Kära nån. Jag vet inte varför det inte kunna hitta det. Det är verkligen konstigt. Jag har den här klassen här. Jag antar att jag kanske måste - oh. Jag är så dum. Jag glömde att lägga till en PHP-tagg. Det är därför. Nu måste jag ångra att 1 förändring jag gjorde precis. Okej. Så där. Det var verkligen dumt. Jag hade inte en öppnings PHP-tagg. Men som ni ser nu att den fungerar på rätt sätt, eller hur? Vi har 1 inlägg. Vi tog det första inlägget, och nu har vi tryckt ut sin kropp. Bra. Fantastiskt. Har du frågor så långt? Nix? Några frågor? Okej, så vi bara skapat efter modell, mycket grundläggande, och vi kommer att lägga till några funktioner senare. Vi kan lägga till valideringar och filtrering. Valideringar är en av de saker att ramar lösa för dig riktigt, riktigt bra, och jag tror inte att ni var tvungna att göra detta för din CS50 pset, men om du gör webbutveckling för ditt slutprojekt, du förmodligen kommer att vilja göra någon form av validering, gillar inte att ha tomma användarnamn, kanske ha ett lösenord med åtminstone någon längd, sådana saker. Och det är verkligen besvärligt att genomföra dessa saker av oss själva, och ganska mycket varje enskild ram webben gör det åt dig och gör att du kan göra det på ett mycket rent sätt. Och modellen är där du i allmänhet uttrycka dessa valideringsregler, eftersom det är validering om en modell är giltig eller inte. Men för nu, vi kommer att sätta det förrän senare, och för nu ska vi jobba på en annan del, och vi kommer att försöka göra en ny vy som listar alla inlägg. De steg som ingår i att göra en ny åtgärd för att lista alla inlägg är att ta en lista över alla inlägg och sedan göra en lista över alla de tjänster genom en vy. Just här, lyckligtvis nog, vi redan gripit alla inlägg med hjälp av denna första raden, den hittar alla funktion, och nu vad vi ska göra är än så länge Jag har varit direkt sätta kroppen av svaret genom att strängen, men nu vill jag använda en vy, och skillnaden mellan en vy och att bara göra denna är med tanke jag kan ha en fin, stor HTML-mall, och vad jag kan göra är att ge det vissa variabler och sedan ha den vyn automatiskt fylla sin mall med hjälp av dessa variabler. Vad jag ska göra är att jag ska skapa en ny vy, och jag ska nämna vyn något som "blogg / index," och jag ska i princip binda detta - åh, vad är det jag skriver? Min hjärna är någon annanstans. Jag ska binda inlägg variabel till vyn, så på det sättet utsikten har tillgång till detta inlägg variabel. Och så nu behöver jag för att skapa denna uppfattning, så här har vi denna mapp som heter "Views," och först kommer jag att skapa en ny mapp under det som kallas "Blog." Det är trevligt. På så sätt kan vi få en trevlig hierarki för våra åsikter. Och då kommer jag att skapa en ny fil i det som heter "index.php". Awesome. Egentligen ska vi ha dem båda här. Att göra en vy fil är förmodligen den enklaste del av allt detta, och dessa är förmodligen saker som du redan är bekant med. Vi ska göra något riktigt enkelt, börja säga, "Min lista över blogginlägg." Då kan vi gå igenom, och vi kan iterera genom inlägg array, ta varenda inlägg och säga något i stil - kanske lägga till en rad och sedan skriva ut författaren och kroppen. Det vettigt hittills? Och låt oss se om det fungerar. Ingenting hände. Jag undrar varför. Åh, jag missade ett steg. Mycket dumt av mig. Jag skapade en vy, men jag ville inte ställa in vyn som svar, så du måste göra en sak till. Du måste göra "detta svar kropp" och ställ in den på att bli av utsikten. Så där. Vi har vår rubrik, och sedan har vi ett inlägg, och bara för sparkar, låt oss sätta en annan tjänst så att vi kan se en lista. Och sätta in dessa 2 inlägg, och nu om jag uppdatera sidan, Vi ser alla dessa inlägg här. Låter det vettigt hittills? Ja, en fråga? Åh, okej. Som ni ser har vi kunnat separera alla dessa koder ut i olika sektioner, och sedan kan du se att det är mest uppenbart i syfte koden. Denna fil här som representerar uppfattning, det bara bryr sig om att representera data, visa data. Det blir passerade någon form av data, och allt den gör är bara visa det för dig. I alla andra delar av din kod, behöver du inte oroa dig för något av detta, och på samma sätt, har din uppfattning kod inte oroa något om hur man kan få tillgång till databasen och så vidare och så vidare, vilket är riktigt bra och gör din kod mycket mer hanterbar. Som jag sa, åsikter, de är dynamiska i att det är 1 fil, men det skulle generera olika vyer utifrån de variabler du faktiskt passerar in, och dessutom finns det en massa olika hjälpfunktioner som du kan använda för att hjälpa dig att skriva din kod snabbare, som jag ska visa dig på bara en sekund. Yeah. [Student] Så $ 0 är en regulator, eller hur? Den andra saken. Frågan är är $ 0 en regulator? $ 0 är en variabel jag skapat här. Jag skapade en uppfattning först. Jag tilldelat det till viss variabel. Då jag passerade det in i denna funktion, ange den som kroppen av svaret. Låter det vettigt? [Student] Så är vy :: fabrik, är vyn som en klass eller ett bibliotek [ohörbart] fabriken funktion? Frågan är om utsikten :: fabriken funktion, och i grund och botten är detta lite mer objektorienterad programmering i grunden. Se är vyn klassen, och den har en metod som kallas "Factory" och det är ett sätt att ta tag i objekt som har namnet "blog / index." Och det är lite mer objektorienterad programmering grejer att jag inte tänker gå in på här för mycket. Nu uppenbarligen, vill vi skapa nya tjänster, men vi vill inte ha att göra det genom en databas, så vi kommer att skapa en ny åtgärd för att skapa ett nytt inlägg, och det finns en massa saker som vi måste göra. Det första vi ska göra - låt oss ta itu med dessa saker en efter en. Det första vi gör är att vi har att skapa ett formulär för att sätta in ett nytt inlägg, men jag kommer också att lägga till en ny åtgärd först, så att lägga till en ny åtgärd är precis lika enkelt som lägga till en ny funktion med handkontrollen, och nu ska jag göra något mycket grundläggande, bara ta denna uppfattning och lägga upp det, bara visa det för dig. Och så nu ska jag skapa en ny vy fil, och jag ska börja skriva lite grejer. Vad är trevligt om Kohana är att de ger en massa olika hjälpfunktioner för dig att skriva vykod lättare, och 1 av dessa hjälpfunktioner eller hjälpare moduler är runt skriver former. För att skriva blanketter, tror jag egentligen inte att direkt skriva någon HTML själv. Ni har skrivit HTML-formulär. Du vet hur det kan vara riktigt, riktigt smärtsamt och besvärligt att skriva blanketter. Det är inte roligt, så som tur är, Vi kan i princip skriva ett formulär med hjälp av Kohana s bildar hjälpfunktioner för att göra det åt oss. Vi kommer att i grunden ha fält för varje enskild sak som vi har, så en för författare och en för kropparna. Vi kommer att ha en etikett, och vi kommer att ha en ingång. Och slutligen, vi kommer att ha en underkastelse. Och som ni kan se, är det mycket renare att skriva än allt det rörigt HTML, vilket är ganska trevligt. Visst, det finns andra webb ramar som har det ännu renare än så, men det är åtminstone bättre än att skriva HTML själv. Awesome, så det här är vad du ser. Det är lite rörigt, så jag kommer att lägga till en radbrytning där för att göra det ser lite trevligare. Jo, naturligtvis, fortfarande ser det riktigt, riktigt illa, men vi bara fokuserat på funktionaliteten för nu och inte om estetik. Ingen tid att göra allt. Och som ni kan se, nu har vi en super grundläggande form, vilket är ganska trevligt. Denna kod skulle jag säga är renare än att försöka skriva en HTML bilda dig själv, så det är trevligt. Vad händer nu? Nu måste vi göra saker med åtgärden. Normalt när man skriver HTML-formulär, du måste berätta det där det kommer att skicka formuläret till. Som standard i de flesta webbramverk, ställs till exakt samma webbadress, så saken är, om du skickar en begäran få till / blog / nytt, det ska visa dig formuläret, men om du skickar ett inlägg begäran till / blog / ny med data, Det borde faktiskt försöka rädda det inlägget och göra något med den. Vad vi ska göra är att i princip allt vi behöver göra för att kontrollera om det är ett inlägg begäran eller begäran få är att kolla vad som är efter variabler som du kan ange. Och om posten variabeln är satt, då ska vi försöka skapa en ny post. Återigen, vi gör just detta, och som skapar ett nytt inlägg, och vi bokstavligen kommer att ställa sina områden som detta, och sedan ska vi rädda den. Och då kommer jag att omdirigera till indexsidan så de kan se vår lista med inlägg igen. Låt oss prova det. Jag säger, "Brandon" och sedan skicka den posten, och om allt går bra, som ni kan se, omdirigeras det mig till indexsidan, och om jag bläddrar till botten, har vi en nyinsatt inlägg. Yay! Ja, fråga. [Student] Tänk om du hade skrivit in exakt samma sak du skrev tidigare? Är det kontrollera att du inte har duplicerat samma underkastelse? Var standard, nej, eftersom som standard - ledsen, frågan är om du skriver in exakt samma data i form och skicka in det, kommer det att du kan sätta in en dubblett objekt, a duplicera post, i huvudsak? Just nu, ja, kommer det att du kan göra det, eftersom i databaser det är helt korrekt att ha helt dubblettrader, men om det är ett bekymmer, då kan du lägga till valideringar, till exempel, att se till att om detta är exakt samma som något som redan finns, då säga att det är ett ogiltigt objekt, och sedan kan du även ange ditt felmeddelande och säga, "Ogiltig eftersom det redan existerar" eller något liknande. Men i detta fall kan jag bara skapa något duplikat. Nu ska vi försöka lägga till några valideringar. Problemet med detta just nu är att Jag kunde bokstavligen lämna in en helt tom inlägg. Jag kan klicka på den här knappen just nu, och där vi går. Du kan inte riktigt se det, men denna extra rad här indikerar att jag bokstavligen har en ny post. Den har bara en tom författare och en tom kropp, och vi vill inte tillåta människor att göra det. Det är där validering kommer in Jag kan gå till min modell objekt, och nu kan jag lägga till en ny funktion som anger vilken valideringsregler jag skulle lägga till denna modell att se till att det är giltigt eller att specificera vad innebär det att vara en giltig inlägg? Och jag vill säga att det är bara en giltig inlägg om både författaren och kropp inte är tom, och det är hur du gör det i Kohana. Du skapar en ny funktion som heter "Regler", och då du i princip tillbaka en associativ array som definierar valideringsregler för detta objekt. Vi kommer att gå tillbaka arrayen, och sedan vad vi ska göra är att säger "författare", det går till en matris, som går till en annan array som heter "inte tom." Och då kommer jag att säga "kropp." Okej, och syntaxen för och struktur för detta kan se lite besvärligt och lite komplicerat. Om du läser dokumentationen, det är ganska enkelt att räkna ut, Men i huvudsak är detta vad du behöver göra för att specificera vissa valideringsregler, och det finns en massa olika regler att Kohana ger dig gratis, som du kan lägga till regler för att säga det måste vara åtminstone denna längd. Kanske det måste vara numeriskt. Kanske det måste vara alfanumeriska. Kanske det måste vara som mest denna längd, så vidare och så vidare. Det finns en massa olika regler som Kohana ger dig, och du kan gå på deras hemsida, titta på dokumentationen, och du kan se alla de olika saker som du kan göra. Men det är allt jag har att göra, och nu ska vi se vad som händer Om jag in ett tomt inlägg. Vad kommer att hända? Åh, nej, jag får ett felmeddelande. Jag får ett undantag validering. Tja, det är bra. Det berättade för mig att min modell är ogiltigt, men jag vill inte visa ett undantag till mina användare när de försöker lämna något ogiltigt, eller hur? Jag vill ge dem någon form av vänligare felmeddelande när något går fel. Vad vi ska göra är att vi ska linda in allt i ett försök fånga slinga. Faktiskt, jag tror att detta är också något som du inte har lärt sig ännu i CS50, eftersom C, programmeringsspråket C, inte har undantag, men nästan varje annat språk har undantag, så riktigt, riktigt kortfattat, Ett undantag är något som en del av koden kan kasta ett undantag när något går fel, men då kanske någon annan bit kod högre upp kan fånga detta undantag och göra något med den. Till exempel i det här fallet, den bit kod som försöker rädda en modell, Det validerar modellen, och om det står, "Okej, är denna modell ogiltigt," det kommer att kasta ett undantag, och det är typ av motsvarande i C du kan returnera en -1 eller något liknande. Och sedan för mig, denna funktion, min kod på en högre nivå, kan jag försöka fånga detta undantag och i princip säga, "Okej, om jag fångar undantaget, vad ska jag göra?" Eller jag kunde välja att inte fånga detta undantag och låta någon högre upp fånga undantag, eller om ingen fångar den, då hela programmet kraschar och säger, "Något gick fel, och jag kunde inte hantera det." Men det vi gör är att du linda en bit kod i ett try-block, och då du även lägga till något som kallas en catch-blocket, vilket är den typ av kod som kommer att försöka fånga undantag som kan uppstå. Och så om jag fånga denna särskilda undantag eller ogiltig undantag, vad jag ska göra är Jag kommer att ställa in fel - jag tror det är hur jag gör det - och jag kommer att ställa de fel på något föremål. Och vad jag ska göra är om den träffar detta undantag, det kommer inte att styra, och om det inte omdirigera, det kommer att komma ut ur den, om bloggen och slå den här bloggen / nya, som vill att jag vill göra. Om det finns ett fel, då jag vill gå tillbaka till den form och visa dessa fel. Nu vad jag vill göra är att jag vill passera på dessa fel till vyn. Okej, jag tror att jag har uppfattningen just här, och i grund och botten vill jag visa dessa fel om de finns. Innan jag skriver HTML för det, jag ska verkligen snabbt visa dig hur strukturen för detta fel variabla ser ut, och detta är en god praxis i allmänhet. Många gånger du får något tillbaka från någon metod, någon funktion inom ramen för webben, och du inte vet vad variabeln ser ut, så att du inte vet hur man arbetar med den. Jag kommer att använda en utskrifts r metod att i princip skriva ut den. Och som ni kan se, säger det mig att det är en associerad matris, och du har en nyckel, författare, pekar på denna sträng, Författaren får inte vara tomma, och en annan tangent, kropp, pekar på en annan sträng, kropp får inte vara tomt. Jag är som, okej, cool. Sedan kan jag iterera igenom arrayen och skriva ut varje enskilt meddelande. Det är i princip som en associativ array med en massa meddelanden. Vad jag ska göra är att "om fel," och jag kommer att skapa en icke ordnad lista, och jag kommer att iterera igenom alla fel. Och det här, och nu ska jag försöka skicka det igen, och låt oss se vad vi får. Nu får vi denna trevliga lista över fel, och det är fortfarande ganska ful, men detta uppenbarligen kan formateras för att se bra ut, men den grundläggande idén är bara i några få rader kod, vi kunde validera vår modell, se till att vissa områden inte var tomma, och om något gick fel, sedan tillbaka något slags felmeddelande Jag kunde då presentera tillbaka till användaren. Du kan också anpassa din validering så att du faktiskt kan få ett felmeddelande som är mer specifika för ditt program eller något liknande. Allt som är allmänt anpassade. Tyvärr, vi ont om tid, så jag kommer att behöva skära av den levande kodning session här. Det finns en massa andra funktioner som jag vill visa för dig i detta exempel. Till exempel kan du lägga till mallar för din webbplats, så kanske det finns någon form av HTML-kod som du vill använda till varje enskild sida på din webbplats, och i stället för att klistra in som i varje enskild vy fil du har, vilket naturligtvis skulle vara en dålig praxis, du kan i princip definiera dessa mallar, och sedan i handkontrollen säga, "Okej, jag använder den här mallen." "Har alla mina åsikter använda den här mallen." Och en sista sak jag vill visa för dig också att vi inte har tid för är cross-site scripting, och i grund och botten tror jag att ni har förmodligen sett i CS50 - Jag tror att David Malan talade förmodligen om hur du oftast kan injicera JavaScript-kod i - har ni pratat om det här? Kanske? Kanske inte? Men många gånger kan du injicera skadlig JavaScript-kod in i någon databas, och om de inte undgå att på rätt sätt, sedan när de presenterar dessa data tillbaka till användaren, då kan det gå någon form av slumpmässiga JavaScript-kod som du inte vill ska hända, och jag kommer att visa hur du skulle göra det inom Kohana. Det är faktiskt riktigt, riktigt enkelt. Jag skulle kunna göra det nu i 2 sekunder bokstavligen. Allt du behöver göra är i grunden linda dessa saker i denna sak kallad HTML-entiteter. Och det kommer automatiskt undan alla tecken på rätt sätt och se till att du inte får det här problemet. [Student] Du stavade det första testet felaktigt. [Brandon Liu] Åh, oops. Okej, det var allt jag hade att dela med dig i dag. Dessa bilder kommer att läggas ut, men dessa är i allmänhet de enda resurser som du bör verkligen behöver för att komma igång med Kohana. Du kan gå till webbplatsen. De har en manual, och de har också ett API explorer. Vi kan utforska alla olika funktioner och hjälpfunktioner som de har för dig. De har i allmänhet tillräckligt med information på webbplatsen som du kan använda för att komma igång och komma igång med Kohana. Det finns inte så många tutorials, tror jag, för Kohana, utanför vad de har på hemsidan här, så det här är förmodligen din bästa insats. Men om du vill gå med ramen webben och du inte vill ha för att plocka upp ett nytt språk, och du vill ha något som är relativt lätt och har en lätt inlärningskurva, Jag skulle definitivt föreslå Kohana. Det är förmodligen det bästa erbjudandet för det. Det lustiga är dock om vi använder Ruby on Rails, vi kunde ha replik vad vi just gjorde och förmodligen mer på under 3 minuter. Inget skämt, men att lära sig Ruby on Rails tar mycket längre tid än vad det skulle ta att lära Kohana. Det är i grunden ditt val på vad du vill välja att lära sig, men om du vill komma igång snabbt, Kohana är definitivt ett mycket bra val. Några sista frågor innan vi avslutar? Ja. [Student] Hur skulle vi integrerar det i en CSS-ramverk som du använde när du instruera? Frågan är hur skulle vi integrerar det med en CSS-ramverk? Vad vi skulle förmodligen göra är att vi skulle förmodligen inkludera en ny mapp där vi skulle dumpa alla CSS-filer, och då skulle vi också lägga till en ny mall. I mallen skulle vi inkludera dessa CSS-filer att se till att de är refererade på varje sida, och sedan när du faktiskt skriver HTML, du bara lägga till lämpliga klasser och vad inte, och till exempel när du använder något som formuläret hjälpare funktion, kan du lägga till fler parametrar i efterhand att ange vilka klasser som du vill bli kopplad till olika saker så att de kunde styla det på rätt sätt, och det är i princip hur du skulle gå. Fler frågor? Awesome. Tack för din tid, och tack för att ni kom. Jag var inte kommer att lägga väldigt mycket annat, men en riktigt snabb sak är att vi inte har en länk till formuläret. Riktigt dum. Låt oss lägga en - faktiskt i vyn, blogg, index, låt oss verkligen snabbt lägga till en länk som går till den nya sidan, sidan där vi kan sätta in en ny post. Vi ska göra det här. Vad är trevligt är att det är hela denna grupp av HTML-hjälpfunktioner som gör olika saker för dig, så att du redan sett de enheter fungera här, men de har också en funktion som kallas "ankare", som du kan skriva i bloggen / nytt och säga, "Skicka in en ny blogg." Och det skulle skapa den länken för dig, och detta verkar verkligen trivialt att göra, men det är trevligt, därför anta att du flyttar din webbplats från 1 domän till en annan. Och om du bara skriver ut adresserna själv, då skulle du behöva ändra alla URL: er. Eller kanske du har flyttat den från 1 undermapp till en annan undermapp. Du måste ändra alla dessa webbadresser själv, och det är inte roligt. Du kan använda denna ankare just här, och du kan ändra den domän eller undermappen prefixet i konfigurationsfilen en gång, och sedan kommer den att gälla att överallt, och detta är, återigen, ett bra exempel på inte upprepa dig själv, att torka din kod ut. Varhelst du upprepa dig själv, försöka extrahera i någon sorts konfigurationsfil eller till en annan funktion och har den hantera det åt dig. Och det allra sista som jag ville visa dig var antar att vi är tillbaka på detta inlägg, och jag hade komponerat några riktigt lång essä, men jag glömde att ta med min författare. Nu när jag klickar på "Skicka inlägg," Jag förlorade allt. Nej! Verkligen sorgligt. Så hur ska du hantera det? Det här är vad vi gör. Vad vi gör är här för dessa in-och textområdet funktioner, Om vi ​​inkluderar en andra parameter, då värdet på den andra parametern kommer att bli det som fältet kommer att vara ifyllda från början. Vad vi kan göra är i vår blogg controller, vi kunde binda en annan variabel. Kalla det "värden" kanske. Och gå på posten array, bokstavligt talat. Det innebär att om valideringen misslyckades, övergå till mig efter array som jag lämnat in från den sista begäran, och på det sättet jag kan använda värdena från min sista inlämning att återbefolka fälten. Nu kan jag göra något liknande värden författare och värde kropp, och så nu om jag gör några random grejer och klicka på "Skicka in", då det stannar där. Men vi kommer att stöta på ett annat problem. Det fungerar, men om jag går till sidan den allra första gången, det kommer att krascha, och det beror på den allra första gången vi går till sidan, har detta inlägg variabel inte definierats ännu. Det är null. Det finns inte. Och vad vi vill säga är att om denna nyckel finns, sedan returnera värdet av denna matris, men om nyckeln inte finns, sedan en tom sträng. Det är de funktioner vi vill ha här. Vi vill kontrollera om nyckeln finns innan du försöker komma åt arrayen, och lyckligtvis nog, Kohana ger oss även en hjälpare funktion för det. De har hela denna svit av funktioner under namnet ARR, kort för samling, och de har 1 funktion som heter "få" och man kan passera i arrayen, och du kan skicka in namnet på nyckeln. Då i princip vad det kommer att göra är att det kommer att försöka få den nyckeln, men om den nyckeln inte finns i arrayen, då den ger tom, eller vi kan också ange en standard, tror jag, vilket är trevligt. Nu om vi gör samma sak igen, då ser du nu det fungerar första gången, och återigen, om vi skriver i någon random stuff och försöka lägga fram, då det stannar där. Och jag antar att jag kan visa dig hur du lägger till en mall riktigt snabbt. Vad vi kan göra först säga kan vi lägga till en ny vy som kallas "template.php" inom Vyer mappen och vad jag ska göra är att jag ska skriva ut något som kallas "innehåll", som kommer att vara min huvudinnehåll. Och kanske längst ner jag ska lägga till, säg, upphovsrätt. [Ohörbar studenten frågan] [Brandon Liu] Kanske detta är en super grundläggande mall jag vill använda. Jag vill ha en mapp med min upphovsrätt på varje sida, och nu vad jag ska göra i mitt controller är nu i stället för att säga, "utökar Controller" Jag kommer att säga, "utökar Controller_Template," och nu i stället för att säga, "svars kropp är lika med denna uppfattning" Jag kommer att säga, "den här mallen innehåll är -" och jag tror - tror jag sätter ett likhetstecken? Jag glömmer. Ja, tänkte jag så. Och nu har jag satt att innehållsvariabel till lika vyn. Jag kan göra samma sak här. Och nu om jag uppdaterar, kan du nu se den här upphovsrätts läggs där, och bara göra några slumpmässiga inlägg, och sedan, igen, bör du se till att upphovsrätten är längst ner på sidan. Stor. Det var allt jag ville visa er. [Applåder] Några frågor? [CS50.TV]