[Seminario] [Kohana: Un leggero PHP quadro] [Brandon Liu] [Harvard University] [Questo è CS50.] [CS50.TV] Ciao a tutti. Il mio nome è Brandon. Sono una junior qui al college fare scienza del computer, e oggi stiamo andando a parlare Kohana, che è un framework di sviluppo web PHP. Oggi sarà un seminario di codifica in tempo reale, così ho praticamente intenzione di spendere 5-10 minuti spiegando cosa Kohana è, e poi ho letteralmente andando a costruire un super semplice blog per voi proprio qui letteralmente da zero. Stiamo andando a scaricare il codice dal sito Kohana, e stiamo per iniziare a costruire un blog, e spero che saremo molto istruttivo, perché vedrete forse magari farò qualche errore, e vedrete me recuperare da loro, o vedrai il mio processo di pensiero, come ho costruito attraverso questo blog, e nel frattempo, avrete anche familiarità con il framework stesso. Speriamo che sarà un esercizio molto istruttivo. In primo luogo, che cosa è esattamente un quadro? Se hai preso CS50 finora, non avete davvero lavorato con qualsiasi quadri ancora, e la cosa è questa. Probabilmente avete fatto uno sviluppo web pset già, e diciamo che si continua a costruire siti web e mantenere costruzione di siti web. Inizierete a notare un paio di cose. La prima cosa che noterete è che probabilmente stai facendo le stesse cose più e più volte per tutto il tempo, cose come la pulizia dei dati di input utente, cose come organizzare i file in un certo modo. L'altra cosa che si nota è anche probabile che il codice può iniziare a diventare molto, molto disordinato, e si può lasciare disordinato e solo avere un momento molto difficile mantenerla, o si può iniziare a strutturare il codice e renderlo modulare in certi modi per renderlo più gestibile. Questo è dove framework web fondamentalmente è venuto dentro Queste persone che avevano costruito un sacco di siti web, hanno detto, "Non abbiamo bisogno di rifare questo ogni volta che costruiamo un sito web." "Perché non facciamo appena un pacchetto che fa tutte queste cose per voi ogni volta che si desidera costruire un sito web? " E in modo che quando si effettua un nuovo sito web, basta concentrarsi su ciò che esattamente questo particolare sito web è di circa. Non è necessario ripetere tutte le varie configurazione e la separazione di codice e codice riscrittura che spesso si devono fare quando si sta facendo siti web. L'idea è che un framework consente di scrivere un codice di livello superiore senza doversi preoccupare dei dettagli di livello inferiore. Un dettaglio di livello inferiore potrebbe essere qualcosa di simile si occupano di pulizia dei dati di input dell'utente. Questo è qualcosa che non si dovrebbe davvero bisogno di preoccuparsi. Si dovrebbe concentrarsi su ciò che il vostro ripartizione web è in realtà circa. Si elimina un sacco di codice standard. Si tratta di una architettura per il progetto. Il più popolare sarebbe Model-View-Controller, che ho intenzione di parlare in un secondo. E un sacco di volte questi quadri incarnano una serie di procedure, regole e best practice per l'uso in modo che quando si adotta il framework web è necessario scrivere il codice in un certo modo, ed è in generale un concordato insieme di principi da parte della comunità che è generalmente accettato di essere un buon modo di scrivere codice. Si rende il codice più gestibile, più usabile, così via e così via. E infine, la cosa che voglio sottolineare in merito a quadri contro librerie è questa idea di inversione del controllo, e la cosa è questa. La differenza tra una biblioteca e un quadro è che con una libreria si sta ancora scrivendo il programma principale, e sei una sorta di invocare la biblioteca e invitando la biblioteca di fare qualcosa per voi. La differenza tra una biblioteca e di un quadro è che il quadro inizia con il controllo, e invoca il codice, così si può pensare ad esso come - questo è il motivo per cui si chiama un quadro - Il framework fornisce questo telaio e la struttura per il codice, e riempire i buchi, e questo diventerà più evidente in un secondo quando si vede di iniziare a scrivere codice nel contesto del quadro. Vedrai che sto colmando le lacune, e il quadro è una specie di controllo di tutte le parti in movimento, e devo mettere i pezzi al posto giusto. Oggi andremo a parlare di Kohana, che è uno dei tanti framework PHP. Ci sono framework web, e ci sono quelli praticamente in ogni singola lingua, e sto raccogliendo Kohana perché Kohana è senza dubbio e generalmente riconosciuto come il framework PHP più facile da prendere. E 'più leggeri. Ci sono altre là fuori che vengono con molte, molte altre caratteristiche, ma tendono ad essere più difficili da prendere. E, infine, Kohana utilizza l'architettura MVC. E 'abbastanza leggero da poter letteralmente costruire un progetto proprio qui, proprio davanti ai vostri occhi, e si può tranquillamente seguire abbastanza facilmente. Qual è l'architettura MVC? Si distingue per il Model-View-Controller, e forse se ci pensate il codice che hai scritto finora per alcuni dei vostri pset sviluppo web si può essere in grado di vedere alcune di queste, ma di solito quando si inizia a scrivere una applicazione web più complesse, la divisione tra questi 3 segmenti diventa sempre più evidente. Ho messo il MVC qui come una specie di pila, e spesso si sente parlare di pile nello sviluppo web, e questo è quello di illustrare l'idea che ogni strato, ogni componente cerca veramente di comunicare solo tra 2 altre componenti. Qualcuno accede al sito web come un client o un browser. Essi interagiscono con il programma attraverso il codice della vista. Il codice vista interagisce con il controller. Il controllore interagisce con il modello, e il modello interagisce con il database SQL. E non c'è salto tra se si scrive il codice corretto. Che cosa fanno queste cose fanno? Il modello è essenzialmente la parte di codice che si occupa con i propri dati. Tutto ciò che riguarda il database, con gli oggetti che vengono archiviati, o il recupero di tali oggetti nel database, Questo è tutto gestito dal modello. Forse avete oggetti del database. Stiamo andando a creare un modello che ha a che fare con i messaggi, quindi un post può avere alcuni attributi ad esso. Si può avere funzioni intorno memorizzare tali posti o il recupero di messaggi o filtrando i messaggi e così via e così via, e questo è tutto il codice che è gestita dal modello. Il controller è una sorta di logica applicativa, e un sacco di cose diverse può andare nella logica dell'applicazione. Se stai parlando di una API diversa, che può essere dove hai a che fare con la logica dell'applicazione. Se stai cercando di avere di portare a dati provenienti da più modelli diversi e devono combinarli in qualche modo, che spesso può essere gestita dal controllore. Ad esempio, su Facebook, se amico di qualcuno, allora forse quell'atto di stabilire quel rapporto può essere fatta dal controllore. E, infine, la vista è il codice che sta generando quello che si vede attualmente. Un sacco di volte penso che nei pset CS50 in realtà non incoraggiano voi ragazzi a separare queste tre cose. Probabilmente dovrete questo grande, file lungo dove in cima fate qualche query SQL e magari fare un po 'di elaborazione sui dati è stato richiamato dal database, e poi avete tutti i vostri HTML nella parte inferiore. E si potrebbe scoprire che quando si creano sempre più pagine che si sta andando ad avere un codice ripetizione, e anche, la cosa è il file diventa veramente grande e lungo e diventa ingombrante da gestire. Il motivo per cui MVC è così ben considerato è per una serie di motivi. La prima cosa è una cosa chiamata separazione degli interessi che è l'idea che quando si ha - idealmente 1 pezzo di codice dovrebbe fare 1 cosa e di farlo davvero bene, e non si deve combinare pezzi di codice che fanno cose diverse. Ad esempio, visualizzare il codice e il codice del modello, non hanno in realtà essere correlati. Essi non devono essere nelle stesse file, in modo che quando si può, li separare quindi è facile da mantenere. L'altra cosa è il riutilizzo del codice. Potreste trovarvi a scrivere la stessa query SQL o fare query simili che potrebbero essere ricavati in 1 funzione, e questa è l'idea dietro modelli e controllori, averlo in una funzione separata che è possibile riutilizzare in luoghi diversi nel progetto. E, infine, che è legato ad essiccamento codice, o non ripetere se stessi, non si deve ripetere se stessi. Questo è molto comprensibile in sviluppo. Ogni volta che si può, non si vuole ripetere se stessi, perché se ti ripeti,  è molto più costoso da mantenere. Se si desidera cambiare 1 cosa, devi cambiare ovunque, e che porta a bug, ed è orribile. Va bene >>. Tutte le domande finora circa Kohana a tutti? Grande. Ora stiamo andando a tuffarsi nella sessione di codifica in tempo reale, e speriamo che tutto vada bene. Ho intenzione di costruire fondamentalmente questo sito su uno dei miei server remoti, e in questo modo voi ragazzi può anche consultare il sito Web e accedere al sito web, e anche l'ambiente è meglio configurata della mia macchina remota, perché è in esecuzione Linux invece di OS X. Stiamo letteralmente sta per iniziare. KohanaFramework.org. Io vado a scaricare il codice dal sito. Io vado a copiare l'indirizzo del link, andare al mio server, scaricare, e sto andando per estrarlo. [Studente] Qual è la cosa più grande è possibile rendere il testo? [Brandon Liu] E 'meglio? [Studente] È che fattibile? [Brandon Liu] Sì, va bene. Ho scaricato un file ZIP e decompresso che in una directory chiamata Kohana, e noi andremo a rinominare che CS50-Kohana, e andiamo dentro Impressionante. Qui si vede un gruppo di file diversi. La maggior parte di voi può ignorare - Ne siamo non andare a passare attraverso ogni singolo file che è qui a causa dei nostri vincoli di tempo, ma in genere quando si installa Kohana, la prima cosa che fai è andare nella directory, e ti fondamentalmente fare alcuni test ambientali e quant'altro per assicurarsi che l'ambiente sia correttamente impostato per eseguire Kohana e assicurarsi che tutto va bene. Potete vedere la maggior parte delle cose passate, ma in genere si esegue sempre in questo 1 problema dove si lamenta che alcune directory non è scrivibile, e questo a causa di alcune autorizzazioni. Non so quanto voi avete imparato a conoscere i permessi dei file in CS50, ma se lo fai lo sviluppo del web, si sta andando a correre in questa edizione molto. Ho intenzione di renderlo scrivibile e penso di avere anche - ce ne andiamo. Bene, ora è possibile vedere tutto passato, e ora vi dirà di rinominare il file install.php. Ho intenzione di spostare il file install.php a installed.php, e ora se mi rinfresco, mi dà qualche errore, e questo è dove il debugging entra in gioco Questo è dove si può vedere cosa sta realmente succederà. Il fatto è che, per impostazione predefinita, Kohana presuppone che il progetto è nella directory principale del proprio dominio, quindi è in attesa di essere a demo.brandonkliu.com. Dobbiamo dire è che in realtà in una sottocartella. E 'in una sottocartella denominata CS50 Kohana. La cosa è, è fraintendendo CS50-Kohana come qualcos'altro, che spiegherò a voi in un secondo. Ma devo dire che è qualcosa che c'è da aspettarselo. Quello che andremo a fare è che stiamo per andare in questa cartella denominata bootstrap.php, che è la cartella di configurazione in cui un sacco di cose diverse sono istituiti. Apro che fino. Allora forse una delle prime cose che farò è cambiare il fuso orario. E poi vediamo. Aha! Proprio qui. Ci sono un sacco di diversi detti di configurazione qui, ma quello che sto cercando è questa cosa chiamata URL di base, e di default ho capito impostato Kohana, ma ho intenzione di cambiare la situazione a CS50-Kohana, e penso che dovrebbe risolvere il problema. Sì, ideale. Per impostazione predefinita, per vedere che sta lavorando, dice, "Ciao Mondo". Dove che provengono da? Come siamo arrivati ​​a Ciao Mondo? Dove esattamente è il codice che in realtà ha scritto che? Per capire questo, io presento questo concetto chiamato routing. Praticamente tutti i framework web hanno il concetto chiamato routing, che è la parte del software che mappa una certa URL a un certo pezzo di codice all'interno del tuo quadro. Ad esempio, se avete qualche indirizzo e si va a qualche URL come foo.com / blog / tutte allora ciò che il quadro sta per fare - o almeno quello che Kohana sta per fare - si sta andando a trovare una classe denominata regolatore blog, e sta andando per eseguire la funzione denominata azione tutti. So che sto parlando di classe e funzioni, e so che voi ragazzi non hanno coperto classi e funzioni in ancora CS50, ma per ora, si può pensare di classi come solo un gruppo di funzioni, un modo per raggruppare funzioni insieme. Questo è davvero tutto quello che dovete sapere. Ora, se guardiamo la nostra struttura di cartelle, all'interno della cartella dell'applicazione c'è un'altra cartella chiamata classi, e le altre cartelle sono chiamati Controller e Model. Se si guarda all'interno della cartella Controller, vediamo che c'è un file chiamato Welcome, e si può vedere qui è una classe denominata controller Benvenuti, e vi è una funzione denominata Action Index, e ciò che fa è imposta il corpo della vostra risposta a Ciao mondo. Ecco dove viene scritto il codice. L'altra domanda è, beh, non è andato a blah, blah, blah, / welcome / index. Come ho fatto a finire qui? Beh, questo è semplicemente perché qui nella parte inferiore del nostro file di bootstrap dove abbiamo impostato le nostre rotte si può vedere che si misero alcuni valori di default per te. Il controller di default è benvenuto. L'azione di default è Index. Ecco perché quando abbiamo messo nulla in là è andato automaticamente al controller di benvenuto e l'azione index. Tutto ha senso fino ad ora? Ora, si può fare di più che andare al controller e un'azione specifica. È anche possibile passare i parametri al controller. A titolo di esempio, Ho intenzione di aggiungere un'altra azione di questo controller visualizzare. Chiamiamo questa azione Echo, perché sta andando per dirvi quello che dà, e così ho praticamente andando a prendere un parametro che sta per essere inviato attraverso di me al programma di routing, e come potete vedere qui, questa linea qui, si può vedere che questo significa fondamentalmente hai controllore, e si ha un /, e si dispone l'azione, e si dispone di un altro /, e che sta per essere parametri, e perché abbiamo questo nome ID tra parentesi angolari, che significa che stiamo nominando questo parametro ID. Più tardi, nel mio codice di controllo se voglio afferrare una presa di tale parametro, Posso usare il codice che ho scritto, trovare il parametro denominato ID. Questo è quello che ho fatto qui, e ho intenzione di tornare e dire, "Lei ha detto" che. E così ora, se vado al nostro sito web, Vado a cs50-kohana/welcome/echo/Helloooo-- oh, che è di destra. C'è 1 punto ho lasciato fuori. Questo è parte dell'idea codifica vivo. Qui è 1 cosa. Vediamo. Quindi normalmente di default con un sacco di queste applicazioni web è necessario includere questa cosa index.php nell'URL, perché l'idea è index.php è una sorta di punto di ingresso della vostra applicazione, ma, naturalmente, che è una sorta di fastidioso avere. Se non si desidera avere index.php appaiono nel vostro URL, e praticamente tutti i web framework out of the box ha questo problema index.php, e quindi bisogna prendere alcune misure per essere in grado di rimuovere tale. E così in questo caso, quello che andremo a fare è che andremo a utilizzare un file chiamato. htaccess, e questo è qualcosa che è specifico per il server web Apache, e può fare cose come riscrittura degli URL e reindirizzare gli URL e così via e così via, e Kohana è abbastanza bello per fornire un file di modello. htaccess che possiamo usare. Come potete vedere, c'è un file chiamato example.htaccess, e stiamo andando a copiare quello a. htaccess. Ho intenzione di aprire questo e modificarlo, e fondamentalmente fa un sacco di cose diverse. La linea tasto si consiglia di guardare è proprio qui. L'idea è che questa imposta una regola che dice, "Va bene, qualunque cosa si digita, anteporre index.php a questo." Si può vedere che. L'. * Sta per nulla, corrisponde nulla, e poi la seconda parte è index.php / $ 0, e $ 0 si riferisce a tutto ciò che è stato abbinato in precedenza. Ritiene che senso? Ma la cosa veramente fondamentale che voglio cambiare è cambiare questa base riscrittura, che è la base URL. E 'sorta di presuppone dove si sta lavorando da. Ho intenzione di aggiungere CS50 Kohana a ciò, e così adesso se mi tolgo la index.php, dovrebbe funzionare, e ho intenzione di aggiungere alcuni numeri per mostrare che davvero ha funzionato. Suona bene. Tutte le domande finora? [Studente] Come ha fatto sapere di fare il 123? È che un argomento? Esattamente. Si può pensare ad esso come un argomento. Ma la cosa strana, però, è che il modo in cui Kohana fa è che non lo fanno esattamente come un argomento. Si deve afferrare come questo. Si deve afferrare l'oggetto di richiesta e chiedere il parametro che viene denominato ID, e che ID nome deriva da quel file di bootstrap che ho mostrato in precedenza, e l'ID nome era in quelle parentesi angolari, ed è così che si afferra tali parametri. Impressionante. Tutte le altre domande? Come ho detto, i controller, che gestiscono la logica dell'applicazione, così che è 1 caso dove si può vedere that - è molto semplice, ma è ancora la logica dell'applicazione, l'idea di afferrare il parametro e creare una nuova stringa che dice: "Hai detto bla", e poi sputare che a te. E in generale quello che fai è creare diversi controllori. Si crea controller separati per le diverse parti del tuo sito web. Oggi stiamo andando a fare un sito web molto semplice, e sta andando ad essere un blog molto semplice. Stiamo andando a fare un nuovo controller solo per i post in un blog. Ma poi se dovessi aggiungere anche commenti al post sul blog, poi avrei probabilmente vuole fare un nuovo controller per tali osservazioni. Se volessi aggiungere utenti, probabilmente aggiungere un nuovo controller per gli utenti, e, in generale, l'idea è che ogni volta che avete un nuovo modello, un nuovo oggetto dati che si sta trattando, si dispone di un unico controllore per l'oggetto di dati. Oggi stiamo solo andando a lavorare con 1 oggetto dati, e che sta per essere posti, e inoltre si può pensare di oggetti dati in quanto corrispondente alle tabelle. Generalmente ogni tabella corrisponde ad 1 tipo di oggetto dati, quindi la tabella palo avrà 1 modello postale, che avrà 1 regolatore posto corrispondente a quella, e lo stesso per i commenti, lo stesso per gli utenti, e così via e così via. E questa è una regola generale. Ci stanno per essere casi particolari in cui si potrebbe differire da quella, ma il 90% del tempo che è quello che si sta andando a fare, e io vi mostrerò che è quello che stiamo andando a fare oggi. 1 altro concetto prima di tuffarci di nuovo nel codice, questa idea di oggetto di mapping relazionale. Voi ragazzi avete già fatto un sviluppo web pset, e avete visto che si effettua una query SQL, e qualunque cosa ritorna a sei righe. È possibile ottenere queste righe, ed è indice di loro da qualche nome, il nome della colonna e la tabella, ed è così che si lavora con esso, e può essere un po 'ingombrante. Ma, inoltre, se avete rapporti all'interno del database, come per esempio se ho commenti e post, allora forse voglio prendere il posto genitore di un commento. Se io uso solo le righe in SQL, quindi tutto quello che posso ottenere è l'ID del post genitore e non il posto vero e proprio. Ma quando siamo codifica, ciò che realmente vogliamo è effettivamente afferrare  il genitore post stesso a volte. Quali oggetto di mapping relazionale fa è prende i risultati della query di database e lo mette in oggetti per voi, che sono molto più bello di lavorare con di matrici semplici e righe. Per esempio, ora quando ho un commento, forse, e voglio prendere il suo posto genitore, e io magari commentare freccia posta, allora sarà effettivamente darmi l'oggetto postale corrispondente al posto genitore reale, non solo alcuni ID, che avrei altrimenti utilizzare e fare un'altra query SQL per afferrare il palo, che è ingombrante e inutile. E inoltre, mappando tutte queste righe di dati in oggetti, è anche possibile allegare più funzioni agli oggetti, così per esempio, ho parlato di come le classi sono essenzialmente gruppi di funzioni. Si può pensare così. Per esempio, forse ho questo oggetto postale, e magari mi piacerebbe avere una sorta di funzione collegato ad esso che in fondo mi dice che è stato postato di recente? Era pubblicato entro l'ultima settimana, vero o falso? E questa è una funzione che posso attaccare su tale oggetto, ed è davvero comodo avere nello stesso luogo, e ci sono una miriade di diverse funzioni è possibile creare per questi oggetti, ed è davvero bello essere in grado di collegarlo a una classe, ad un oggetto, mentre se hai appena avuto le righe provenienti dal database, allora non si può davvero attaccare qualsiasi funzionalità a questo. E 'letteralmente solo dati. Tutte le domande che a tutti? ORM sono lo sviluppo web molto comune, e ci sono un sacco di diversi tipi di ORM, e Kohana ha il suo ORM. E 'molto semplice, ma si otterrà un assaggio di quello che sembra. Creiamo un modello per i nostri blog, e la prima cosa che ovviamente dobbiamo fare è creare una tabella effettiva all'interno del nostro database per memorizzare effettivamente i nostri dati per tali posti. La prima cosa che ho intenzione di fare è andare a phpMyAdmin. Avete ragazzi usato phpMyAdmin prima? Ok, fantastico, così voi ragazzi sanno già di cosa si tratta, e ho intenzione di creare una nuova tabella denominata Kohana Messaggi, e che sta per essere veramente semplice. Dovrò accedere nuovamente dentro Tutto quello che andremo a fare oggi è di avere un autore e un corpo, basta mantenere le cose semplici. Ho intenzione di creare quel tavolo, e ora non ci resta che un tavolo che rappresenta i nostri post con 2 campi per il nostro autore e il nostro corpo. L'altra cosa che sto per fare ora è configurare la mia applicazione web in modo che sa come connettersi al database, e questo, ancora una volta, è una cosa che dovrete fare con tutte le applicazioni web. Devi dire il nome utente e la password e il nome del database e così via e così via per capire come collegare effettivamente al database. In Kohana, abbiamo qualcosa chiamato un modulo di database, e nella cartella di configurazione abbiamo questa cartella chiamata database, e come potete vedere, ci sono un sacco di impostazioni è necessario impostare qui per dirgli che cosa è il nome utente e la password per il database in modo che possa effettivamente connettersi ad esso. E siccome io non voglio che voi ragazzi di conoscere realtà il nome utente e la password del mio database, Ho un file dove ho già impostato il tutto, e ho intenzione di copiare e incollare sopra. Impressionante. Ok. Penso che tutta la configurazione che devo fare, ma vediamo. Noi continueremo a lavorare in essa, e se qualcosa si blocca, poi ci sistemeremo. Ora, che cosa ho intenzione di fare è che ho intenzione di creare un nuovo controller. O addirittura, mi dispiace. Prima devo creare un nuovo modello. Creerò un nuovo modello chiamato post.php, e quello che andremo a fare è che stiamo andando a chiamarlo classe Model_Post. Get Some evidenziazione della sintassi su, e così quando dico, "si estende ORM", che è fondamentalmente una programmazione più orientato agli oggetti, che purtroppo voi ragazzi non hanno ancora imparato a CS50, ma è abbastanza facile da raccogliere. Mi dà tutte queste funzionalità in più che viene in questo pacchetto ORM, e quindi ho un sacco di funzioni extra e quant'altro libero, che vedrete un po 'di in un secondo. In questo momento in realtà tutto quello che devo fare è creare questa classe. Non ho nemmeno bisogno di fare qualsiasi funzione o nulla, ma ho creato una classe che rappresenta la tabella, e perché ho esteso questa classe ORM, Posso avere un sacco di cose gratuitamente, quindi per ora non devi impostare qualcosa di più alto. E ora che cosa ho intenzione di fare è che ho intenzione di creare un nuovo controller, che ho intenzione di nominare blog.php, e ho intenzione di copiare il controller di benvenuto così non devo riscrivere alcune cose, e ora devo rinominare questo. Ora, che cosa ho intenzione di fare per testare per assicurarsi che tutto sta lavorando, Io vado a prendere il primo post dal mio database e stampare il corpo del messaggio sullo schermo. Per fare che cosa ho intenzione di fare prima è ho intenzione di salvare i posti a una variabile così quello che andremo a fare è - in Kohana ciò che si fa è quello di afferrare l'oggetto postale È un po 'ingombrante, ma devi fare questa cosa chiamata ORM :: fabbrica, e poi si passa il nome del modello che si desidera, e restituisce l'oggetto ORM che rappresenta quel modello. E poi, come ho detto, quando estendiamo l'oggetto ORM, otteniamo tutti questi metodi gratis, quindi, ad esempio, otteniamo questa nuova funzione chiamata "trova tutti" che restituisce automaticamente ogni singolo post nel database, che è piuttosto comodo. E ora nel corpo ho intenzione di tornare il primo post e restituisce il suo corpo. E, naturalmente, ho bisogno di creare un post, quindi cerchiamo di inserire un nuovo post. Io dico: "Brandon, il mio primo post." Impressionante. E ora stiamo per andare a blog e se tutto funziona bene - oh, questo è di nuovo qualche altra cosa di autorizzazione del file muto. Aspetta 1 secondo. È una specie di assurdo. Ci andiamo. Ok. Ho risolto quel problema di permessi. Si stava cercando di creare alcuni file e alcune di log, e le autorizzazioni, ancora una volta, non sono stati impostati correttamente, così ho reso così quei file sono stati scrivibile ed eseguibile in modo che possa effettivamente accedere alle cose. Ora mi sta dando un altro detto eccezione ", classe ORM non trovata", e questo perché ho dimenticato un altro passo. Questo è troppo male. Nel file cartella di avvio, ci sono questi moduli qui, che è possibile scegliere di attivare o disattivare. Si tratta di una serie di caratteristiche differenti che è possibile scegliere di utilizzare entro Kohana, che è una sorta di piacevole. Ad esempio, hanno un modulo di autenticazione che è possibile utilizzare per l'autenticazione degli utenti. Hanno un modulo di caching, se si desidera implementare una sorta di cache back-end per rendere il lavoro applicazione più veloce e quant'altro. Abbiamo bisogno di attivare il database e il modulo ORM, perché come ho detto, stiamo usando il database, ovviamente, e abbiamo anche bisogno di attivare il modulo ORM, perché ci piacerebbe avere funzionalità extra, che è bello avere. Tutto quello che devo fare è togliere il commento quei 2 linee, e ora se mi rinfresco, mi ha dato un altro errore. Dice, "Class Model_Post non trovata". Ora, questo è un buon problema da avere. Vediamo. Renderlo pubblico. No. Aspetta. Oh, cara. Non so perché non è in grado di trovare questo. Questo è davvero strano. Ho questa classe qui. Credo che avrei potuto - oh. Io sono così stupido. Ho dimenticato di aggiungere un tag PHP. Ecco perché. Ora devo disfare che 1 cambiamento che ho appena fatto. Va bene >>. Ci andiamo. E 'stato davvero stupido. Non ho avuto un tag PHP di apertura. Ma come potete vedere, ora sta funzionando correttamente, giusto? Abbiamo 1 posto. Abbiamo preso il primo post, e ora abbiamo stampato il suo corpo. Grande. Fantastico. Tutte le domande finora? No? Tutte le domande? Ok, quindi abbiamo creato il modello di posta, molto semplice, e abbiamo intenzione di aggiungere alcune funzioni in seguito. Possiamo aggiungere validazione e filtraggio. Convalide sono una delle cose che i quadri di risolvere per davvero, davvero bene, e non credo che voi ragazzi dovevano fare questo per il vostro pset CS50, ma se lo fai lo sviluppo del web per il progetto finale, si sta probabilmente andando a voler fare una sorta di validazione, come non avere nomi utente vuoti, forse con una password con almeno una certa lunghezza, cose del genere. Ed è davvero difficile attuazione di queste cose da noi stessi, e praticamente ogni singolo framework web che fa per voi e ti permette di farlo in un modo molto pulito. E il modello è dove generalmente esprimere queste regole di convalida, perché è la convalida se un modello è valido o meno. Ma per ora, stiamo andando a mettere che solo più tardi, e per ora stiamo andando a lavorare su un'altra parte, e stiamo andando a cercare di fare una nuova vista che elenca tutti i posti. I passi necessari per fare una nuova azione messa in vendita di tutti i posti è quello di afferrare un elenco di tutti i post e quindi rendere la lista di tutti i post tramite una vista. Proprio qui, per fortuna, abbiamo già afferrato tutti i messaggi Utilizzando questo prima linea, la trova tutta la funzione, e adesso che stiamo andando a fare è finora Sto installando direttamente il corpo della risposta passando la stringa, ma ora voglio utilizzare una visualizzazione, e la differenza tra una vista e fare solo questo è in vista posso avere una bella, grande template HTML, e quello che posso fare è farlo passare alcune variabili e poi hanno la vista popolare automaticamente il relativo modello l'utilizzo di tali variabili. Quello che farò è creerò una nuova vista, e io ti nomino la vista qualcosa come "blog / index" e ho intenzione di legare in fondo questo - oh, che cosa sto scrivendo? Il mio cervello è altrove. Ho intenzione di legare i posti variabili alla vista, in modo che modo la vista ha accesso a questa variabile posta. E così ora ho bisogno di creare questo punto di vista, ecco abbiamo questa cartella chiamata "Visite" e in primo luogo, ho intenzione di creare una nuova cartella sotto quella denominata "Blog". Questo è bello. In questo modo possiamo avere una bella gerarchia per le nostre opinioni. E poi ho intenzione di creare un altro file in là chiamato "index.php". Impressionante. In realtà, diamo loro sia qui. Fare un file di vista è probabilmente la parte più semplice di tutto questo, e queste sono cose che probabilmente siete già familiarità con. Stiamo andando a fare qualcosa di veramente semplice, inizia dicendo: "La mia lista dei post del blog." Allora possiamo passare attraverso, e possiamo scorrere la matrice post, afferrare ogni singolo post e dire qualcosa di simile - magari aggiungere una riga e poi stampare l'autore e il corpo. Che ha senso fino ad ora? E vediamo se funziona. Non è successo niente. Mi chiedo perché. Oh, ho perso 1 punto. Molto sciocco di me. Ho creato una vista, ma non ho impostato la vista come la risposta, quindi bisogna fare di più 1 cosa. Devi fare "questo corpo di risposta" e impostarlo per essere vista. Ci andiamo. Noi abbiamo la nostra voce, e poi abbiamo un post, e solo per i calci, inseriamo un altro post così possiamo vedere una lista. E inserire questi 2 posti, e ora se mi aggiorna la pagina, vediamo tutti questi posti qua. Il che ha senso fino ad ora? Sì, una domanda? Oh, okay. Come potete vedere, siamo stati in grado di separare tutti questi codici out in diverse sezioni, e poi si può vedere che è più chiaro con il codice della vista. Questo file qui che rappresenta la visualizzazione, si preoccupa solo di rappresentazione dei dati, la visualizzazione dei dati. Esso viene passato qualche tipo di dati, e tutto ciò che fa è solo mostrare a voi. In tutte le altre parti del codice, non dovrete preoccuparvi di nulla di tutto ciò, e allo stesso modo, il codice vista non si deve preoccupare nulla come accedere al database e così via e così via, che è veramente buono e rende il codice molto più gestibile. Come ho detto, vista, sono dinamica che è 1 file, ma genererebbe diversi punti di vista in base alle variabili che effettivamente passano, e, inoltre, vi sono molte diverse funzioni di supporto che è possibile utilizzare per aiutare a scrivere il codice più velocemente, che vi mostrerò in appena un secondo. Già. [Studente] Quindi, $ 0 è un controller, giusto? Questa seconda cosa. La domanda è: è $ 0 un controllore? 0 $ è una variabile che ho creato proprio qui. Ho creato una vista prima. Ho assegnato a qualche variabile. Poi ho passato in questa funzione, impostare come il corpo della risposta. Ritiene che senso? [Studente] Così è la vista :: fabbrica, è vista come una classe o un [incomprensibile] funzione factory biblioteca? La domanda riguarda la funzione di visualizzazione :: fabbrica, e in fondo questo è un po 'più di programmazione orientata agli oggetti essenzialmente. Vista è la classe di visualizzazione, e ha un metodo chiamato "Factory", e questo è un modo per afferrare l'oggetto che viene chiamato "blog / index." E questo è un po 'più orientato agli oggetti roba programmazione che io non ho intenzione di andare in qui troppo. Ora, ovviamente, vogliamo creare nuovi posti, ma non vogliamo avere a che fare attraverso un database, così stiamo andando a creare una nuova azione per la creazione di un nuovo post, e c'è un sacco di cose che dobbiamo fare. La prima cosa che andremo a fare - cerchiamo di affrontare queste cose una per una. La prima cosa che faremo è che abbiamo avuto modo di creare un modulo per inserire un nuovo post, ma ho anche intenzione di aggiungere una nuova azione prima, quindi l'aggiunta di una nuova azione è semplice come l'aggiunta di una nuova funzione con il controller, e per ora ho intenzione di fare qualcosa di molto semplice, basta afferrare questo punto di vista e post-it, basta visualizzarlo per te. E poi ora ho intenzione di creare un nuovo file di visualizzazione, e ho intenzione di iniziare a scrivere alcune cose. Il bello di Kohana è che essi forniscono un sacco di diverse funzioni di supporto per voi a scrivere il codice vista più facilmente, e 1 di quelle funzioni di supporto o moduli di supporto è intorno a scrivere forme. Per scrivere moduli, non ho davvero scrivere direttamente codice HTML me stesso. Voi ragazzi avete scritto form HTML. Sapete come può essere molto, molto doloroso e ingombrante per scrivere forme. Non è divertente, per fortuna, possiamo fondamentalmente scrivere un form utilizzando Kohana di formare funzioni di supporto per farlo per noi. Stiamo per avere fondamentalmente campi per ogni singola cosa che abbiamo, così uno per gli autori e uno per i corpi. Stiamo per avere una etichetta, e stiamo andando ad avere un ingresso. E poi finalmente, stiamo per avere una presentazione. E come potete vedere, questo è molto più pulito di scrivere di tutto ciò che HTML disordinato, che è una specie di piacevole. Certo, ci sono altri framework web che hanno ancora più pulito di quello, ma almeno questo è meglio che scrivere il codice HTML da soli. Impressionante, quindi questo è ciò che si vede. Questo è il tipo di disordinato, così ho intenzione di aggiungere una interruzione di linea lì a fare quello sguardo un po 'più bello. Beh, certo, sembra ancora molto, molto male, ma siamo solo focalizzata sulla funzionalità per ora e non sull'estetica. Non c'è tempo per fare tutto. E come potete vedere, ora abbiamo una forma eccellente di base, che è una specie di piacevole. Questo codice direi che è più pulita di cercare di scrivere un HTML formare se stessi, così che è bello. Quali sono le prospettive? Ora abbiamo bisogno di fare le cose con l'azione. Normalmente, quando si scrive moduli HTML, devi dirgli dove sta andando a presentare il modulo. Per impostazione predefinita, nella maggior parte dei framework web, sottopone alla stessa identica URL, quindi la cosa è, se si invia una richiesta GET / blog / nuovo, dovrebbe visualizzare il modulo, ma se si invia una richiesta POST a / blog / nuovo con i dati, esso dovrebbe effettivamente provare a salvare quel post e fare qualcosa con esso. Quello che andremo a fare è praticamente tutto quello che dobbiamo fare per verificare se si tratta di una richiesta POST o una richiesta GET è quello di verificare quali sono le variabili postali è possibile impostare. E se la variabile post è impostata, quindi andremo a cercare di creare un nuovo post. Ancora una volta, dobbiamo solo fare questo, e che crea un nuovo post, e stiamo letteralmente andando a impostare i campi come questo, e poi andremo a salvarlo. E poi ho intenzione di reindirizzare alla pagina indice in modo che possano vedere la nostra lista di posti di nuovo. Proviamo questo. Dirò, "Brandon" e quindi inviare il post, e se tutto va bene, come potete vedere, mi ha reindirizzato alla pagina di indice, e se scorrere fino alla fine, abbiamo un post appena inserito. Yay! Gia ', questione. [Studente] Che cosa se tu avessi inserito esattamente la stessa cosa immesso prima? Ha controllare per essere sicuri di non aver duplicato la stessa presentazione? Essere di default, no, perché di default - scusate, la questione è se si entra negli stessi dati esatti in forma e sostengono che, sarà permetterà di inserire un oggetto duplicato, un duplicato voce, in sostanza? In questo momento, sì, vi permetterà di farlo, perché nel database è perfettamente valida avere righe completamente duplicate, ma se questo è un problema, allora si può aggiungere validazioni, per esempio, fare in modo che, se questo è esattamente lo stesso come qualcosa che già esiste, poi dire che si tratta di un oggetto non valido, e poi si può anche specificare il messaggio di errore e dire: "non valido perché questo già esiste", o qualcosa di simile. Ma in questo caso, potrei semplicemente creare qualcosa duplicato. Ora proviamo e aggiungere alcune convalide. Il problema di questo momento è che Potrei letteralmente inviare un post completamente vuoto. Posso fare clic su questo pulsante destro del momento, e ci andiamo. Non si può davvero vedere, ma questa linea supplementare qui indica che ho letteralmente ho un nuovo post. E 'solo un autore bianco e un corpo vuoto, e noi non vogliamo permettere alle persone di farlo. Qui è dove entra in gioco la convalida Posso andare al mio oggetto del modello, e ora posso aggiungere una nuova funzione che specifica quali regole di convalida dovrei aggiungere a questo modello per assicurarsi che sia valido o specificare che cosa significa essere un messaggio validi? E voglio dire che è solo un post valida se sia l'autore e il corpo non sono vuote, e questo è come si fa in Kohana. Si crea una nuova funzione chiamata "Regole" e poi che, fondamentalmente, torna un array associativo che definisce le regole di convalida per questo oggetto. Stiamo per restituire la matrice, e poi quello che andremo a fare è dire "autore", si va a un array, che va a un altro array chiamato "non vuota". E poi ho intenzione di dire "corpo". Okay, e la sintassi per questo e la struttura di questo può sembrare un po 'ingombrante e un po' complicato. Se leggete la documentazione, è abbastanza semplice da capire, Ma in sostanza questo è ciò che devi fare per specificare alcune regole di convalida, e ci sono un sacco di regole diverse che Kohana vi darà gratuitamente, come è possibile aggiungere regole a dire deve essere almeno tale lunghezza. Forse deve essere numerico. Forse deve essere alfanumerica. Forse deve essere al massimo questa lunghezza, così via e così via. Ci sono un sacco di regole diverse che Kohana prevede per voi, e si può andare sul loro sito web, consultare la documentazione, e si possono vedere tutte le cose diverse che si possono fare. Ma questo è tutto quello che devo fare, e ora vediamo cosa succede se presento un post vuoto. Cosa succederà? Oh, no, ottengo un errore. Ottengo un'eccezione di convalida. Beh, è ​​buono. Mi ha detto che il mio modello è valido, ma io non voglio visualizzare un'eccezione ai miei utenti quando cercano di presentare qualcosa di valido, giusto? Voglio dare loro una sorta di messaggio di errore amichevole quando qualcosa va storto. Quello che andremo a fare è che andremo a avvolgere tutto in un ciclo try catch. In realtà, credo che questo sia anche qualcosa che non hai ancora imparato in CS50, perché C, il linguaggio di programmazione C, non ha eccezioni, ma quasi ogni altra lingua ha eccezioni, così davvero, davvero brevemente, un'eccezione è qualcosa che un pezzo di codice può un'eccezione quando qualcosa va storto, ma poi forse qualche altro pezzo di codice più in alto può prendere tale eccezione e fare qualcosa con esso. Ad esempio, in questo caso, il pezzo di codice che sta cercando di salvare un modello, convalida del modello, e se dice: "Okay, questo modello è valido" sta andando un'eccezione, e questo è una specie di equivalente a in C si potrebbe restituire un -1 o qualcosa di simile. E poi, per me, questa funzione, il mio codice ad un livello superiore, posso provare e prendere tale eccezione e in fondo dico: "Va bene, se prendo l'eccezione, cosa devo fare?" Oppure potrei scegliere di non prendere quel eccezione e lasciare che qualcuno più in alto intercettare l'eccezione, o se nessuno la prende, quindi l'intero programma si blocca e dice: "Qualcosa è andato storto, e non ho potuto gestire." Ma quello che facciamo è avvolgere un pezzo di codice in un blocco try, e poi si aggiunge anche qualcosa chiamato un blocco catch, che è il tipo di codice che cercherà di intercettare le eccezioni che possono verificarsi. E così, se prendo questa particolare eccezione o eccezione invalidazione, allora che cosa ho intenzione di fare è Ho intenzione di impostare gli errori - Penso che sia come lo faccio - e ho intenzione di impostare gli errori di qualche oggetto. E allora che cosa ho intenzione di fare è se colpisce questa eccezione, non sta andando per reindirizzare, e se non reindirizza, che sta per uscire dal caso blog e ha colpito questo blog / nuovo, che si voglio voglio fare. Se c'è un errore, allora voglio tornare al modulo e visualizzare tali errori. Ora quello che voglio fare è che voglio passare quegli errori alla vista. Ok, penso di avere la vista proprio qui, e fondamentalmente voglio visualizzare tali errori se esistono. Prima di scrivere il codice HTML per questo, sto andando davvero in fretta mostrare ciò che la struttura di questi errori sguardi variabili come, e questa è una buona pratica in generale. Un sacco di volte si ottiene qualcosa da qualche metodo, qualche funzione nell'ambito web, e tu non sai cosa la variabile sembra, quindi non si sa come lavorare con esso. Ho intenzione di utilizzare un metodo di stampa r per stamparlo in fondo. E come potete vedere, mi dice che è una matrice socio, e si dispone di una chiave, autore, punti a questa stringa, l'autore non deve essere vuoto, e un altro tasto, il corpo, punti per un'altra stringa, il corpo non deve essere vuoto. Mi piace, va bene, fresco. Allora posso scorrere la matrice e stampare ogni singolo messaggio. E 'fondamentalmente come un array associativo con un gruppo di messaggi. Quello che ho intenzione di fare è "se errori" e ho intenzione di creare una lista non ordinata, e ho intenzione di scorrere tutti gli errori. E questo, e ora ho intenzione di provare a inviare di nuovo, e vediamo cosa otteniamo. Ora abbiamo questa bella lista di errori, e questo è ancora piuttosto brutto, ma questo ovviamente può essere formattato aspetto gradevole, ma l'idea di base è solo in poche linee di codice, siamo stati in grado di validare il nostro modello, fare in modo che alcuni campi non erano vuoti, e se qualcosa è andato storto, per poi tornare una sorta di messaggio di errore Ho potuto quindi presentare di nuovo per l'utente. È inoltre possibile personalizzare la vostra convalida in modo che si può effettivamente avere un messaggio di errore che è più specifica per l'applicazione o qualcosa di simile. Tutto ciò che è generalmente personalizzabile. Purtroppo, siamo a corto di tempo, così ho intenzione di dover tagliare la sessione di codifica diretta qui. Ci sono un sacco di altre caratteristiche che voglio dimostrare per voi in questo esempio. Ad esempio, è possibile aggiungere modelli per il tuo sito, così forse c'è qualche sorta di codice HTML che si desidera applicare ad ogni singola pagina del sito, e invece di incollare che in ogni singolo file vista che hai, che ovviamente sarebbe una cattiva pratica, si può sostanzialmente definire questi modelli, e poi nel controller dico: "Va bene, sto usando questo modello." "Sono tutte le mie opinioni utilizzare questo modello." E l'ultima cosa che voglio dimostrare a voi pure che non abbiamo tempo per è cross-site scripting, e in fondo penso che voi ragazzi avete probabilmente visto in CS50 - Penso che David Malan probabilmente ha parlato di come di solito si può iniettare Il codice JavaScript in - hai parlato di questo? Forse? Forse no? Ma un sacco di volte che si può iniettare codice JavaScript malevolo nella banca dati di qualcuno, e se non sfuggono che correttamente, poi quando presentano i dati di nuovo per l'utente, allora può eseguire una sorta di codice JavaScript casuale non si vuole che accada, e stavo per dimostrare come si farebbe che entro Kohana. In realtà è molto, molto facile. Potrei farlo adesso in 2 secondi, letteralmente. Tutto quello che dovete fare è fondamentalmente avvolgere queste cose in questa cosa chiamata entità HTML. E che fuggire automaticamente tutti i caratteri correttamente e assicuratevi di non avere questo problema. [Studente] Lei digitato il primo test in modo errato. [Brandon Liu] Oh, oops. Ok, questo è tutto quello che dovevo condividere con voi oggi. Queste diapositive stanno per essere pubblicato, ma questi sono generalmente le uniche risorse si dovrebbe realmente bisogno per iniziare con Kohana. Si può andare al sito. Hanno una guida d'uso, e hanno anche una API esploratore. Siamo in grado di esplorare tutte le diverse funzioni e funzioni di supporto che hanno per voi. Generalmente hanno sufficienti informazioni sul sito che è possibile utilizzare per iniziare e andare avanti con Kohana. Non ci sono molti tutorial, credo, per Kohana, al di fuori di quello che hanno sul sito qui, quindi questa è probabilmente la scelta migliore. Ma se si vuole andare con il framework web e non si vuole avere a raccogliere una nuova lingua, e si desidera qualcosa che è relativamente leggero e ha una curva di apprendimento facile, Consiglierei assolutamente Kohana. Questa è probabilmente la migliore offerta per questo. La cosa divertente, però, è se stessimo usando Ruby on Rails, avremmo potuto replicare quello che abbiamo appena fatto e probabilmente più in meno di tre minuti. Non è uno scherzo, ma imparare Ruby on Rails richiede molto più tempo quello che ci vuole per imparare Kohana. E 'fondamentalmente la vostra scelta su ciò che si vuole scegliere di imparare, ma se si vuole ottenere rapidamente operativi, Kohana è sicuramente una scelta molto buona. Tutte le ultime domande prima finiamo? Sì. [Studente] Come possiamo integrare il in un quadro CSS come si stava utilizzando quando stavi insegnando? La domanda è: come potremmo integrare il quadro con un CSS? Quello che probabilmente avremmo fatto è probabilmente avremmo includere una nuova cartella in cui vorremmo scaricare tutti i nostri file CSS, e poi avremmo anche aggiungere un nuovo modello. Nel modello che avevamo includiamo i file CSS per assicurarsi che stanno riferimento a ogni singola pagina, e poi quando in realtà sta scrivendo HTML, basta aggiungere classi e quant'altro appropriati, e, per esempio, quando si utilizza qualcosa come la forma funzione di supporto, è possibile aggiungere più parametri in seguito per specificare quali classi si desidera essere collegato a varie cose in modo che potessero stile correttamente, e questo è in fondo come si dovrebbe andare. Altre domande? Impressionante. Grazie per il vostro tempo, e vi ringrazio per essere venuti. Non avevo intenzione di aggiungere molto altro, ma 1 cosa veramente breve è che non abbiamo un collegamento alla forma. Veramente stupido. Aggiungiamo a - in realtà nella vista, blog, indice, diamo davvero aggiungere rapidamente un collegamento che va alla nuova pagina, la pagina in cui possiamo inserire un nuovo post. Stiamo andando a fare questo. Il bello è che c'è tutto questo gruppo di funzioni helper HTML che fare diverse cose per voi, in modo già visto le entità funzionare qui, ma hanno anche una funzione chiamata "anchor" che è possibile digitare in blog / nuovo e dire: "Apri un nuovo blog." E sarebbe creare quel link per te, e questo sembra davvero banale da fare, ma questo è bello, perché supponiamo che si sta spostando il vostro sito web da 1 dominio ad un altro. E se hai appena scritto le URL da soli, allora si dovrebbe cambiare tutti gli URL. O forse si è spostato dal 1 sottocartella ad un'altra sottocartella. Si dovrebbe cambiare tutte le URL da soli, e che non è divertente. È possibile utilizzare questa ancora qui, e si può cambiare il dominio o il prefisso sottocartella nel file di configurazione una volta, e allora sarà diffusa che ovunque, e questo è, di nuovo, un grande esempio di non ripetere se stessi, asciugare il codice fuori. Ovunque si sta ripetendo te stesso, cercare ed estrarre in una sorta di file di configurazione o ad una funzione diversa e farlo gestire per voi. E l'ultima cosa che volevo mostrare era supponiamo siamo tornati in questo post, e avevo composto alcuni davvero lungo saggio, ma ho dimenticato di includere il mio autore. Ora, quando clicco su "Invia Messaggio" Ho appena perso tutto. No! Davvero triste. Così come si fa a trattare con questo? Questo è quello che facciamo. Quello che facciamo è qui per queste funzioni di ingresso e area di testo, se si include un secondo parametro, allora il valore di tale secondo parametro sta per essere quello che il campo sta per essere inizialmente popolata con. Quello che potremmo fare è nel nostro regolatore blog, potremmo associare un'altra variabile. Chiamatela "valori" forse. E passare nella matrice postale, letteralmente. Questo significa che se la convalida non è riuscita, passare a me la matrice post che ho presentato dalla ultima richiesta, e in questo modo posso utilizzare i valori dalla mia ultima presentazione per ripopolare i campi. Ora posso fare qualcosa come valori autore e valori del corpo, e in questo modo ora se faccio alcune cose a caso e fare clic su "Invia Messaggio", quindi rimane lì. Ma stiamo andando a correre in un altro problema. Che funziona, ma se vado alla pagina la prima volta, sta andando in crash, e questo perché la prima volta andiamo alla pagina, questa variabile messaggio non è stato ancora definito. E 'nullo. Non esiste. E quello che vogliamo dire è che se questa chiave esiste, poi restituire il valore di questa matrice, ma se la chiave non esiste, allora restituire una stringa vuota. Questa è la funzionalità che vogliamo qui. Vogliamo verificare se la chiave esiste prima di tentare di accedere alla matrice, e per fortuna, Kohana ci dà anche una funzione di supporto per questo. Hanno tutta questa serie di funzioni sotto il nome di ARR, abbreviazione di array, e hanno 1 funzione chiamata "get", e si può passare nella matrice, e si può passare il nome della chiave. Poi fondamentalmente quello che farà è sarà cercare di ottenere quella chiave, ma se tale chiave non esiste nella matrice, poi tornerà in bianco, o possiamo anche specificare un valore predefinito, credo, che è bello. Ora, se noi facciamo la stessa cosa di nuovo, poi si vede ora funziona la prima volta, e ancora, se si digita in alcune cose a caso e cercare di presentare, poi rimane lì. E credo che posso anche mostrare come aggiungere un modello molto velocemente. Che cosa possiamo fare prima è che possiamo aggiungere una nuova visualizzazione denominata "template.php" all'interno della cartella Views, e che cosa ho intenzione di fare è che ho intenzione di stampare qualcosa chiamato "contenuto", che sta per essere la mia pagina principale. E forse in fondo ho intenzione di aggiungere, per esempio, copyright. [Incomprensibile questione studente] [Brandon Liu] Forse questo è un ottimo modello di base che voglio usare. Voglio avere una cartella con il mio copyright su ogni singola pagina, e adesso che ho intenzione di fare nel mio controller è ora invece di dire, "si estende Controller" Sto per dire, "si estende Controller_Template" e ora invece di dire, "corpo di risposta è uguale a questo punto di vista," Sto per dire "questo contenuto è template -" e credo - posso mettere un segno di uguale? Ho dimenticato. Sì, ho pensato così. E ora ho impostato la variabile contenuto uguale la vista. Posso fare lo stesso qui. E ora, se rinfresco, si può vedere ora questo copyright è aggiunto là, e basta fare alcuni post a caso, e poi, di nuovo, si dovrebbe vedere che il copyright è in fondo alla pagina. Grande. Questo è tutto quello che volevo mostrarvi ragazzi. [Applausi] Tutte le domande? [CS50.TV]