[Seminario] [Kohana: A Lightweight PHP Framework] [Liu Brandon] [Harvard University] [Isto é CS50.] [CS50.TV] Ola a todos. O meu nome é Brandon. Eu son un Júnior aquí na facultade facendo ciencia da computación, e hoxe imos falar de Kohana, que é un framework de desenvolvemento web PHP. Hoxe será un seminario de codificación en directo, entón eu estou basicamente vai gastar 5-10 minutos explicando o que Kohana é, e entón eu estou literalmente indo a construír un blog super sinxelo para vostede aquí literalmente de cero. Nós imos facer a descarga do código na web da Kohana, e imos comezar a construír un blog, e espero que vai ser moi instrutivo, porque vai ver, quizais, quizais eu vou cometer algúns erros, e verás me recuperar a partir deles, ou vai ver o meu proceso de pensamento como eu construír a través deste blog, e mentres tanto, tamén vai familiarizado co propio cadro. Esperemos que só pode ser un exercicio moi instrutivo. En primeiro lugar, o que é exactamente un framework? Se está tomando CS50 ata agora, realmente non estou traballando con calquera Aínda estruturas, ea cousa é esta. Probablemente xa fixo un desenvolvemento web pset xa, e digamos que seguir a construír sitios e manter a construción de sitios web. Vai comezar a notar algunhas cousas. O primeiro que vai notar é que ten que estar facendo as mesmas cousas unha e outra vez o tempo, cousas como a limpeza de datos de entrada do usuario, cousas como organizar os seus arquivos dunha certa maneira. A outra cousa que tamén probablemente vai notar é que o seu código pode comezar a ser moi, moi confuso, e pode deixar confuso e só ten un tempo moi difícil mantelo, ou pode comezar a estruturar o seu código e facelo modular en determinadas formas de facelo máis sostible. Este é o lugar onde frameworks web, basicamente, veu dentro Estas persoas que construíran unha morea de sitios, segundo eles, "Non necesitamos renovar este cada vez que construír un sitio web." "Por que non imos só facer un paquete que fai todas estas cousas para ti cada vez que quere construír un sitio web? " E así que cando fai un novo sitio web, vostede concentrarse só sobre o que exactamente este determinado sitio é sobre. Non precisa repetir todas as varias configuración e separación de códigos e código de reescribir que moitas veces ten que facer cando se está facendo sitios. A idea é que un cadro permite que escriba un código de nivel superior sen ter que se preocupar de detalles de nivel inferior. Un detalle de baixo nivel pode ser algo así como xestionar a limpeza de datos de entrada do usuario. Isto é algo que non debe realmente se preocupe. Debe concentrarse no que a súa distribución web é realmente sobre. El elimina unha chea de código cliché. É unha arquitectura para o seu proxecto. O máis popular sería Model-View-Controller, que eu vou falar en un segundo. E unha morea de veces, esas estruturas incorporan un conxunto de procedementos, normas e as mellores prácticas para que use de xeito que cando adopta o framework web ten que escribir o código de certa maneira, e é xeralmente un acordo sobre conxunto de principios pola comunidade que é xeralmente aceptado para ser unha boa forma de escribir código. Non fai o seu código máis sostible, máis útil, así por diante e así por diante. E, finalmente, a cousa que quero salientar sobre encadramentos contra bibliotecas é esa idea de inversión de control, ea cousa é esta. A diferenza entre unha biblioteca e un cadro é que, cunha biblioteca aínda está escribindo o programa principal, e está tipo de chamar a biblioteca e apelando á biblioteca para facer algo por ti. A diferenza entre unha biblioteca e un cadro é que o cadro comeza co control, e invoca o código, así que pode pensar niso como - é por iso que se chama un cadro - a estrutura ofrece este cadro e estrutura para o seu código, e encher os buratos, e este quedará máis evidente na segunda cando me ve comezar a escribir código dentro do contexto do cadro. Vai ver que eu estou cubrindo as lagoas, eo cadro é unha especie de control de todas as pezas móbiles, e eu teño que poñer as pezas nos lugares determinados. Hoxe imos falar Kohana, que é un dos moitos frameworks PHP. Existen frameworks web, e hai aqueles en practicamente todas as linguas único, e eu estou pegando Kohana Kohana porque é indiscutibelmente e xeralmente recoñecido como o marco máis fácil PHP para incorporarse. É o máis lixeiro. Hai outros aí fóra, que veñen con moitos, moitos máis recursos, pero eles tenden a ser máis difíciles de coller. E, finalmente, Kohana utiliza a arquitectura MVC. É leve o suficiente para que pode literalmente construír un proxecto aquí ben en fronte dos seus ollos, e pode moi ben seguir con bastante facilidade. ¿Que é a arquitectura MVC? Queda ao Model-View-Controller, e, se cadra, se pensar sobre o código que escribiu ata agora para algúns dos seus Serie de exercicios de desenvolvemento web pode ser capaz de ver un pouco diso, pero normalmente cando comezar a escribir unha aplicación web máis complexas, a división entre estes tres segmentos faise cada vez máis evidente. Engada o MVC aquí especie de como unha pila, e moitas veces vai escoitar a xente falar sobre pilas en desenvolvemento web, e dicir, para ilustrar a idea de que cada capa, cada compoñente realmente intenta comunicarse só entre dous outros compoñentes. Alguén accede a súa web como un cliente ou un navegador. Interactúan co seu programa a través do código vista. O código de visión interactúa co controlador. O controlador interactúa co modelo, e que o modelo interactúa coa base de datos de SQL. E non hai ningún salto entre se escribir o código correctamente. O que estas cousas fan? O modelo é esencialmente a parte do código que trata sobre os seus datos. Todo o que trata sobre o seu banco de datos, cos obxectos que almacena, ou recuperar os obxectos na base de datos, que está todo tratado polo modelo. Quizais ten obxectos no seu banco de datos. Nós imos crear un modelo que teña a ver as mensaxes, así un post pode ter algúns atributos para iso. Pode ter funcións arredor de almacenar esas mensaxes ou recuperar mensaxes ou filtrar as anotacións e así por diante e así por diante, e iso é todo o código que é tratado polo modelo. O controlador é unha especie de lóxica da aplicación, e unha morea de cousas distintas poden ir na lóxica da aplicación. Se está falando con unha API distinto, que poden estar onde está lidando coa lóxica da aplicación. Se estás a ter de traer datos de varios modelos diferentes e teñen a combina-los de algunha maneira, que moitas veces pode ser tratada polo controlador. Por exemplo, en Facebook, se amigo de alguén, entón quizais este acto de establecer esa relación se pode facer polo controlador. E, finalmente, a visión é o código que está xerando o que realmente ve. Moitas veces penso nas Serie de exercicios CS50 realmente non fomentar vostedes a separar estas tres cousas. Probablemente vai ter este arquivo grande, longa, onde na parte superior fai algunha pesquisa e quizais facer un procesamento sobre os datos obtidos a partir da base de datos, e entón tes todo o seu HTML na parte inferior. E pode considerar que como crear máis e máis páxinas que vai ter algún código de repetición, e tamén, a cousa é o arquivo queda moi grande e longa e faise difícil de xestionar. A razón pola que MVC é tan ben visto é por un número de razóns. O primeiro é unha cousa chamada separación de intereses que é a idea de que cando ten - idealmente unha peza de código que facer unha cousa e facelo moi ben, e non debe combinar pezas de código que fan cousas distintas. Por exemplo, ver o código e código do modelo, realmente non teñen que ser relacionados. Non ten que ser nos mesmos arquivos, entón, cando poida, para separa-los polo que é fácil de manter. A outra cousa é a reutilización de código. Podes atopar-se escribir a mesma procura de SQL ou facer consultas semellantes que poden ser abstraídas nunha función, e esa é a idea detrás modelos e controladores, telo nunha función separada que pode ser reutilizado en diferentes lugares no seu proxecto. E, finalmente, que está ligada a secado do seu código, ou non repetirse, non repetirse. Iso é moi comprensible en desenvolvemento. Sempre que poida, non quere repetir a si mesmo, porque se repetir-se,  é moito máis caro para manter. Se queres cambiar algo, ten que muda-lo en todos os lugares, e que leva a erros, e é horrible. Todo ben. Calquera dúbida, ata agora uns Kohana, ao final? Grande. Agora imos mergullo na sesión de codificación en directo, e espero que todo corra ben. Vou construír basicamente esta web en un dos meus servidores remotos, e de que xeito podedes tamén ver o sitio web e acceder ao sitio, e tamén o ambiente é mellor que o meu configurar máquina remota, porque está a empregar Linux no canto de VOS X. Estamos literalmente vai comezar. KohanaFramework.org. Eu estou indo a baixar o código do sitio web. Vou copiar o enderezo da ligazón, ir ao meu servidor, baixalo, e eu estou indo a extraelo lo. [Estudante] O que é o máis grande que pode facer o texto? [Brandon Liu] Está mellor? [Estudante] É iso factible? [Brandon Liu] Si, iso é bo. Eu baixei un arquivo ZIP e abriu o zíper que nun directorio chamado Kohana, e nós imos cambiar o nome que CS50-Kohana, e imos alí dentro Incrible. Aquí vese unha morea de arquivos diferentes. A maioría de vós pode ignorar - estamos non vai pasar por todos os arquivos que están aquí por mor das nosas limitacións de tempo, pero normalmente cando se instala o Kohana, o primeiro que fai é que vaia ao directorio, e vai basicamente facer algunhas probas ambientais e outros adornos asegurarse de seu ambiente está configurado correctamente para realizar Kohana e asegúrese de que está todo ben. Podes ver que a maioría das cousas pasaron, pero normalmente sempre executar para este problema 1 onde el se queixa de que algún directorio non pode escribir nel, e iso é debido a algúns permisos. Eu non sei o que vós aprenderon sobre permisos de arquivo en CS50, pero se fai de desenvolvemento web, vai se atopou con este problema moito. Eu estou indo para facelo escribir e eu creo que eu tamén teño que - alí imos nós. Ok, entón agora pode ver todo pasou, e agora vai dicir para cambiar o nome do ficheiro install.php. Vou mover o ficheiro install.php para installed.php, e agora, se eu actualizar, dáme un erro, e é aí onde a depuración vén dentro Este é o lugar onde se pode ver o que está realmente vai ocorrer. A cousa é, por defecto, Kohana asume que seu proxecto está no directorio raíz do seu dominio, polo que está esperando por ti para ser a demo.brandonkliu.com. Debemos dicir que é realmente en un subcartafol. Está nunha subcarpeta chamada CS50 Kohana. A cousa é, está interpretando mal CS50-Kohana como calquera outra cousa, que eu vou explicar a vostede en un segundo. Pero debo dicirlle que é algo que é de esperar. O que imos facer é que nós estamos indo a ir a esta carpeta chamada bootstrap.php, que é o cartafol de configuración, onde unha chea de cousas distintas son creados. Abro isto. Entón, talvez, unha das primeiras cousas que eu vou facer é cambiar a zona horaria. E entón imos ver. Aha! Ben aquí. Hai un grupo de proverbios diferentes de configuración aquí, pero o que eu estou buscando é esa cousa chamada URL base, e, por defecto, eu entendo establecido para Kohana, pero eu vou cambiar isto para CS50-Kohana, e eu creo que debe resolve-lo. Si, gran. Por defecto, ao ver que está a traballar, el di: "Ola Mundo". Onde é que isto veu? Como chegamos a Ola Mundo? Onde exactamente é o código que realmente escribiu isto? Para entender iso, vou presentar este concepto chamado de enrutamento. Practicamente todos os frameworks web ten o concepto chamado de enrutamento, cal é a parte do programa que ha mapear unha determinada URL a un determinado anaco de código dentro do seu cadro. Por exemplo, se tes algunha URL e ir a algún URL como foo.com / blog / all a continuación, o que o cadro vai facer - ou polo menos o que Kohana vai facer - é o que vai atopar unha clase chamada controlador de blog, e está indo para executar a función chamada acción todos. Sei que estou a falar de clase e funcións, e sei que vós non cobren clases e funcións en CS50 aínda, pero, polo momento, pode pensar en clases como só un grupo de funcións, unha forma de agrupar as funcións en conxunto. Isto é realmente todo o que precisa saber. Agora, se miramos para a nosa estrutura de carpetas, dentro do cartafol da aplicación hai outra carpeta chamada clases e as outras carpetas son chamadas de Controladoria e Modelo. Se ollar dentro do cartafol Controller, vemos que hai un ficheiro chamado Benvido, e pode ver aquí é unha clase chamada Controlador Benvido, e hai unha función chamada Índice Acción, eo que fai é que define o corpo da súa resposta a Ola Mundo. Isto é onde o código está escrito. A outra cuestión é, ben, eu non ir blah, blah, blah, / welcome / index. Como é que vin parar aquí? Ben, iso é simplemente porque aquí no fondo do noso arquivo de inicialización onde montar nosas rutas podes ver que definir algúns patróns para ti. O controlador por defecto é benvido. A acción por defecto é Index. É por iso que cando poñemos nada alí el automaticamente se ao controlador de Benvido ea Acción índice. Todo ten sentido ata agora? Agora, pode facer máis que ir ao Controlador e unha acción específica. Tamén pode pasar parámetros para o controlador. Só como exemplo, Eu estou indo a engadir outra acción para este controlador para lle amosar. Imos chamar esta acción Echo, porque lle vai dicir o que dá, e entón eu estou basicamente vai pegar un parámetro que será enviada a través de min para o programa de enrutamento, e como podes ver aquí, esta liña ben aquí, pode ver que iso basicamente significa que ten control, e ten a /, e ten acción, e ten máis /, e que será parámetros, e por que temos este nome ID dentro corchetes, o que significa que estamos nomeando este parámetro ID. Máis tarde, o meu código do controlador, se eu quere incorporarse un soto de que o parámetro, Podo usar o código que escribín, atopar o parámetro nomeado ID. Iso é o que eu fixen aquí, e eu vou volver e dicir: "Vostede dixo" iso. E agora, se eu for a nosa web, Vou para cs50-kohana/welcome/echo/Helloooo-- Oh, iso é certo. Existe un paso que deixei de fóra. Iso forma parte da idea de codificación en directo. Aquí está unha cousa. Imos ver. Entón, normalmente, por defecto, con unha morea desas aplicacións web ten que incluír esa cousa index.php na súa URL, porque a idea é index.php é unha especie de punto de entrada da súa aplicación, aínda que por suposto, que é unha especie de chat ter. Non quere ter index.php aparecer na súa URL, e practicamente todos os framework web fóra da caixa ten este problema index.php, e entón ten que tomar algunhas medidas para ser capaz de eliminar iso. E así, neste caso, o que nós imos facer é que imos empregar un ficheiro chamado. htaccess e iso é algo que é específico para o servidor web Apache, e pode facer cousas como reescrita de URL e redireccionar URLs e así por diante e así por diante, e Kohana é bo o suficiente para proporcionar un arquivo htaccess modelo. que podemos utilizar. Como verás, hai un ficheiro alí chamado example.htaccess, e imos copiar tanto para. htaccess. Vou abrir este e editalo, e, basicamente, fai unha morea de cousas distintas. A liña de clave que pode querer ollar é ben aquí. A idea é que esta establece unha regra que di que, "Todo ben, todo o que escribe, preceder index.php para iso." Podes ver iso. A. * Significa nada, corresponde a nada, e logo, a segunda parte é index.php / $ 0, e US $ 0 refírese a todo o que foi combinado previamente. Será que isto ten sentido? Pero a cousa realmente fundamental quero cambiar é cambiar esta base de reescrita, que é a base de URL. É unha especie de toma onde está a traballar. Eu estou indo a engadir CS50 Kohana para que, e de que xeito, agora se eu eliminar o index.php, debe funcionar, e eu estou indo a engadir algúns números para amosar que realmente non funcionou. Parece bo. Todas as preguntas ata agora? [Estudante] Como foi saber para facer o 123? Isto é un argumento? Exactamente. Podes pensar niso como un argumento. Pero o máis estraño, con todo, é que o xeito no que o fai Kohana é que non fan iso exactamente como un argumento. Ten que agarrá-lo así. Ten que incorporarse o obxecto da solicitude e solicitar o parámetro que se chama ID, e que o nome vén do ID que ficheiro de arranque que eu mostre antes, eo nome do ID era naqueles corchetes, e é así que incorporarse eses parámetros. Incrible. Algunha pregunta? Como dixen, os controladores, eles lidan coa lóxica da aplicación, de xeito que é un caso en que se pode ver iso é - é moi básico, pero aínda é a lóxica da aplicación, a idea de coller o parámetro e crear unha nova cadea que di: "Vostede dixo que bla," e despois cuspindo que volta para ti. E, xeralmente, o que fai é crear controladores diferentes. Se crea controladores separados para diferentes partes do seu sitio. Hoxe imos facer un sitio moi sinxelo, e iso vai ser un blog moi básico. Nós imos facer un novo controlador só para os cargos en un blog. Pero, entón, se eu fose para engadir tamén os comentarios ao post do blog, entón eu probablemente quere facer un novo controlador para estes comentarios. Se eu quixese engadir usuarios, eu probablemente quere engadir un novo controlador para os usuarios, e, en xeral, a idea é que cada vez que tes un novo modelo, un novo obxecto de datos que está lidando, ten un único controlador para o obxecto de datos. Hoxe nós só imos traballar cun obxecto de datos, e que será mensaxes, e tamén pode pensar en obxectos de datos como correspondendo ás táboas. Xeralmente cada táboa corresponde a un tipo de obxecto de datos, así a táboa de pos terá un modelo de post, que terá un controlador de post correspondente a este, e mesmo para comentarios, a mesma para os usuarios, e así por diante e así por diante. E iso é unha regra xeral. Non van haber casos especiais onde pode ser distinta da que, pero o 90% do tempo é o que vai estar facendo, e eu vou amosar-lle que é o que imos facer hoxe. 1 máis concepto, antes de mergullar ao seu código, esa idea de mapeamento obxecto relacional. Vós xa fixeron un desenvolvemento pset web, e viu que faga unha consulta SQL, e todo o que el retorna a vostede son liñas. Vostede está con esas liñas, e indexa-los por algún nome, o nome da columna e da táboa, e é así que se traballa con el, e pode ser un pouco máis complicado. Pero ademais, se ten relacións dentro do seu banco de datos, como, por exemplo, se eu tivera comentarios e artigos, entón quizais eu queira incorporarse o post pai dun comentario. Se eu usar só liñas en SQL, entón todo o que podo chegar é o ID do post pai e non o propio post real. Pero cando estamos a codificación, o que nós realmente queremos é realmente coller  o pai poñer-se algunhas veces. O mapeamento obxecto relacional fai é leva os resultados da consulta de base de datos e poñelas obxectos para ti, que son moito máis agradable para traballar con de matrices simples e liñas. Por exemplo, agora, cando ten un comentario, se cadra, e quero coller o seu posto pai, e eu quizais comentar post frecha, a continuación, el vai realmente me dar o obxecto post correspondente ó cargo de pai real, e non só algúns ID, que eu tería doutra forma de usar e facer outra consulta SQL para incorporarse o post, que é pesado e innecesario. E ademais, mapeando todas estas liñas de datos en obxectos, Tamén pode engadir máis funcións aos obxectos, así, por exemplo, eu falei sobre como as clases son esencialmente grupos de funcións. Pode pensar así. Por exemplo, é posible que teña ese obxecto post, e quizais me gustaría ter algún tipo de función conectado a el que basicamente dime que foi recentemente publicou? Foi publicado na última semana, verdadeiro ou falso? E esa é unha función que eu poida achegar o obxecto que, e é moi conveniente para telo no mesmo lugar, e hai unha serie de funcións distintas que pode crear para estes obxectos, e é moi bo para ser capaz de anexo-lo a unha clase, a un obxecto, mentres que, se só tiña liñas que veñen de base de datos, entón realmente non pode achegar calquera función para iso. É, literalmente, só datos. Calquera dúbida sobre iso en todo? ORMs son o desenvolvemento web moi común, e hai un gran número de diferentes tipos de ORMs, Kohana e ten o seu propio ORM. É moi básico, pero vai ter un gostinho do que parece. Imos crear un modelo para os nosos artigos, eo primeiro que obviamente que facer é crear unha táboa real dentro do noso banco de datos para almacenar os nosos datos, en realidade, a eses lugares. O primeiro que vou facer é ir ao phpMyAdmin. Vós xa usado phpMyAdmin antes? Ok, impresionante, entón vós xa saben o que é, e eu estou indo a crear unha nova táboa chamada Kohana Mensaxes, e iso vai ser moi sinxelo. Vou facer o login para atrás dentro Todo o que nós imos facer hoxe é ter un autor e un corpo, só mantela simple. Eu estou indo a crear esa táboa, e agora só temos unha táboa representando nosos artigos con 2 campos para o noso autor e noso corpo. A outra cousa que eu vou facer agora é configurar miña aplicación web para que saiba como se conectar á base de datos, e este, unha vez máis, é algo que vai ter que facer todas as aplicacións web. Ten que dicir a el o nome de usuario eo contrasinal e nome da base de datos e así por diante e así por diante para descubrir como realmente conectarse ao seu banco de datos. En Kohana temos algo chamado un módulo de base de datos, e no cartafol de configuración temos esta carpeta chamada base de datos, e como se pode ver, hai unha morea de opcións que ten que definir aquí para dicir o que é o nome de usuario eo contrasinal para a base de datos para que eu poida realmente conectarse a el. E desde que eu non quero que vostedes realmente saben nome de usuario e contrasinal do meu banco de datos, Eu teño un arquivo onde xa definir todo, e eu vou copiar e pegalo sobre. Incrible. Okay. Creo que esa é toda a configuración que eu teño que facer, pero imos ver. Seguiremos a traballar nel, e se algo falla, entón nós imos resolve-lo. Agora o que eu vou facer é que eu vou crear un novo controlador. Ou, en realidade, me desculpe. Primeiro eu teño que crear un novo modelo. Vou crear un novo modelo chamado Post.php, eo que nós imos facer é que imos chamalo de clase Model_Post. Obter un destaque de sintaxe en, e así, cando eu digo, "esténdese ORM", que é basicamente algo máis de programación orientada a obxectos, que, por desgraza, vostedes non aprenderon en CS50 aínda, pero é moi fácil de incorporarse. Tanto me dá toda esta función extra que ven neste paquete ORM, e así eu recibín unha morea de funcións extra e outras cousas de balde, que vai ver algo nun segundo. Agora, en realidade, todo o que eu teño que facer é crear esta clase. Eu nin sequera precisa facer calquera función ou calquera cousa, pero eu creei unha clase que representa a táboa, e por que eu teño estendido esta clase ORM, Eu recibín unha morea de cousas de balde, así que polo de agora non ten que configurar algo máis para arriba. E agora o que vou facer é que eu vou crear un novo controlador, que eu vou citar blog.php, e eu vou copiar o controlador de benvida entón eu non teño que redigitar algunhas cousas, e agora eu teño que cambiar o nome deste. Agora o que eu vou facer para probar para asegurarse que todo está dando certo, Vou incorporarse o primeiro post do meu banco de datos e imprimir o corpo da mensaxe na pantalla. Para iso o que eu vou facer primeiro é que eu vou gardar as mensaxes a unha variable de xeito que nós imos facer é - en Kohana o que fai é ir o obxecto post é medio complicado, pero ten que facer esa cousa chamada ORM :: fábrica, e entón pasar o nome do modelo que quere, e el retorna o obxecto ORM que representa este modelo. E entón, como dixen, cando estenden o obxecto ORM, temos todos estes métodos de balde, así, por exemplo, temos esa nova función chamada "atopar todos", que retorna automaticamente cada post na base de datos, o que é moi cómodo. E agora no corpo eu vou volver o primeiro post e voltar o seu corpo. E, por suposto, eu teño crear un post, entón imos introducir un novo post. Eu vou dicir: "Brandon, o meu primeiro post." Incrible. E agora nós estamos indo a ir a blogs e se todo funciona ben - Oh, iso é outra cousa de permisos de ficheiro mudo de novo. Espere un segundo. É unha especie de absurdo. Alí imos nós. Okay. Eu que problema de permisos. Estaba intentando crear algúns arquivos e algúns rexistro, e os permisos, unha vez máis, non foron debidamente configurado, entón eu fixen iso para que os arquivos foron escribir e executable para que el puidese realmente facer sesión ás cousas. Agora que está me dando outro dito excepción ", clase ORM non atopado" e iso é porque eu esquezo outra etapa. Iso é moi malo. O arquivo de pasta de arranque, existen estes módulos aquí, que pode optar por activar ou desactivar. Trátase de unha chea de características diferentes que pode optar por usar dentro Kohana, que é unha especie de bo. Por exemplo, eles teñen un módulo de autenticación que pode usar para autenticar usuarios. Teñen un módulo de almacenamento en memoria, se quere aplicar algún tipo de caché de back-end para facer o traballo de aplicación máis rápida e outros enfeites. Necesitamos permitir que a base de datos eo módulo ORM, porque como dixen, estamos a usar a base de datos, por suposto, e nós tamén necesitamos activar o módulo ORM, porque nós queremos ter a funcionalidade extra, que é bo ter. Todo o que teño que facer é descomentar estas dúas liñas, e agora, se eu actualizar, el me deu outro erro. Ela di: "Clase Model_Post Non se atopou." Agora este é un problema bo de ter. Imos ver. Facelo público. Non Espere. Oh, querida. Eu non sei por que non é capaz de atopar isto. Iso é moi raro. Eu teño esa clase ben aquí. Eu creo que eu podería ter que - oh. Eu son tan burro. Esquecín de engadir un código PHP. É por iso. Agora eu teño que desfacer este cambio 1 eu fixen. Okay. Alí imos nós. Iso foi moi parvo. Eu non tiña unha etiqueta PHP apertura. Pero, como podes ver, agora funciona correctamente, non? Temos un post. Pegamos o primeiro post, e agora nós impreso o seu corpo. Grande. Fantástico. Todas as preguntas ata agora? Non? Algunha pregunta? Ok, entón nós acabamos de crear o modelo de post, moi básico, e nós imos engadir algunhas funcións máis tarde. Podemos engadir validações e filtrado. As validacións son unha das cousas que os cadros resolver para ti moi, moi ben, e eu non creo que vostedes tiñan que facelo para o pset CS50, pero se fai de desenvolvemento web para o seu proxecto final, probablemente vai querer facer algún tipo de validación, como non ter nomes de usuario en branco, quizais ter un contrasinal con, polo menos, algún tempo, cousas así. E é realmente complicado de aplicar esas cousas por nós mesmos, e practicamente todos os framework web único fai por ti e permite que fai iso dun xeito moi limpa. E o modelo é o lugar onde se adoita expresar esas regras de validación, porque é validar un modelo é válido ou non. Pero, por agora, imos poñer isto até máis tarde, e polo de agora imos traballar noutra parte, e imos tratar de facer unha nova visión que lista todas as mensaxes. As etapas implicadas na toma de unha nova acción para consultar todas as mensaxes é incorporarse unha lista de todas as mensaxes e logo, facer unha lista de todas as mensaxes a través dun punto de vista. Aquí, por sorte o suficiente, xa colleu todas as mensaxes empregando esta primeira liña, a atopar todas as funcións, e agora o que imos facer é ata agora Teño está a establecer directamente o corpo da resposta pasando a corda, pero agora quero usar un punto de vista, ea diferenza entre unha vista e só facendo iso está con unha visión que eu poida ter un bo, modelo gran HTML, eo que podo facer é pasar algunhas variables e, a continuación, ter a visión de encher automáticamente o seu modelo usando estas variables. O que vou facer é que eu vou crear un novo punto de vista, e eu vou citar o punto de vista algo como "Blog / index" e eu vou conectar basicamente iso - Oh, o que estou escribindo? O meu cerebro está noutro lugar. Vou chamar as variables para a exhibición mensaxes, de xeito que forma o punto de vista ten acceso a esta variable post. E agora eu teño para crear ese punto de vista, entón aquí temos esta carpeta chamada "Visto", e en primeiro lugar, eu vou crear un novo cartafol no que chama "Blog". Iso é bo. Desta forma, podemos ter unha xerarquía agradable para os nosos puntos de vista. E entón eu vou crear outro ficheiro alí chama "index.php". Incrible. De feito, imos ter os dous aquí. Facendo un arquivo de vista, probablemente é a parte máis sinxela de todo isto, e estas son probablemente as cousas que xa está familiarizado. Nós imos facer algo moi sinxelo, comezar a dicir: "A miña lista de artigos do blog." Entón, podemos pasar, e nós pode percorrer a matriz mensaxes, coller cada post e dicir algo así como - quizais engadir unha liña e, a continuación, imprimir o autor eo corpo. Isto ten sentido ata agora? E imos ver se funciona. Non pasou nada. Eu me pregunta por que. Oh, eu perda un paso. Moi parvo de min. Eu creei un punto de vista, pero eu non definir a vista como a resposta, así que ten que facer unha cousa. Ten que facer ", este corpo de resposta" e configuralo para ser a vista. Alí imos nós. Temos o noso campo, e entón temos un post, e só por diversión, imos introducir un outro post para que poidamos ver unha lista. E inserir estas dúas mensaxes, e agora eu actualizar a páxina, vemos todos estes artigos aquí. Será que ten sentido ata agora? Si, unha pregunta? Oh, todo ben. Como verás, fomos capaces de separar todos estes códigos para fóra en seccións diferentes, e entón podes ver que é máis claro, co código de punto de vista. Este ficheiro aquí que representa o punto de vista, el só se preocupa coa representación de datos, mostrando datos. El é pasado algún tipo de datos, e todo o que fai é só mostra-lo a vostede. En todas as outras partes do seu código, non terá que preocuparse de nada diso, e do mesmo xeito, o seu código de vista non ten que preocupar-se sobre calquera cousa como acceder a base de datos e así por diante e así por diante, o que é moi bo e fai que o seu código moito máis fácil de manter. Como dixen, puntos de vista, son dinámicos en que é un ficheiro, pero ía xerar diferentes puntos de vista con base nas variables que realmente pasar en, e, ademais, hai un gran número de funcións auxiliares que pode usar para axudar a escribir o seu código máis rápido, que eu vou lle amosar en só un segundo. É. [Estudante] Entón $ 0 é un controlador, non? Esta segunda cousa. A pregunta é é de R $ 0 a controlador? $ 0 é unha variable que eu creei aquí. Eu creei unha visión de primeira. Eu lle atribúe a algunha variable. Entón, eu pase a esta función, axustalo como o corpo da resposta. Será que isto ten sentido? [Estudante] Entón, é vista :: Factory, é vista como unha clase ou unha biblioteca [inaudível] función de fábrica? A cuestión é sobre a función de visualización :: fábrica, e, basicamente, este é un pouco máis de programación orientada a obxectos esencialmente. Ver é a clase vista, e el ten un método chamado "Fábrica" e iso é un xeito de coller o obxecto que está co nome "Blog / index." E iso é un pouco de material de programación orientada a obxecto que eu non vou entrar aquí moito. Agora, obviamente, queremos crear novas mensaxes, pero non quero ter que facelo a través dun banco de datos, entón imos crear unha nova acción para a creación dun novo post, e hai unha morea de cousas que temos que facer. O primeiro que imos facer - imos afrontar esas cousas un por un. O primeiro que imos facer é que temos que crear un formulario para a inserción dun novo post, pero eu tamén estou indo a engadir unha nova acción en primeiro lugar, así que engadir unha nova acción é tan fácil como engadindo unha nova función co seu controlador, e agora eu vou facer algo moi básico, basta incorporarse este punto de vista e public-lo, só tes que indicalo lo para ti. E entón agora eu vou crear un novo ficheiro de punto de vista, e eu vou comezar a escribir algunhas cousas. Que é agradable sobre Kohana é que fornecen unha gran cantidade de diferentes funcións auxiliares para ti escribir código vista con máis facilidade, e unha desas funcións auxiliares ou módulos auxiliares está en torno de formas de escribir. Para escribir as formas, eu realmente non teño que escribir directamente calquera HTML min. Vostedes escribiron formularios HTML. Vostede sabe como pode ser moi, moi doloroso e complicado para escribir formas. Non é divertido, polo que, por sorte, podemos basicamente escribir un formulario mediante Kohana do formar funcións auxiliares para facelo por nós. Estamos indo a basicamente ter campos para cada cousa que temos, así un para autores e outra para os corpos. Nós imos ter unha etiqueta, e nós imos ter unha entrada. E entón, finalmente, nós imos ter unha submisión. E como podes ver, este é moito máis limpo para escribir que todo o que HTML desorde, o que é ben legal. Concedido, hai outros frameworks web que teñen aínda máis limpo do que iso, pero polo menos é mellor que escribir o código HTML mesmo. Impresionante, entón iso é o que ve. Isto é medio confuso, entón eu estou indo a engadir un salto de liña non para facer este ollar un pouco máis agradable. Ben, por suposto, aínda parece moi, moi malo, pero nós estamos só enfocados en función de agora e non na estética. Sen tempo para facer todo. E como se pode ver, agora temos unha forma de super básico, o que é ben legal. Este código eu diría que é máis limpo do que tentando escribir un HTML formar-se, de xeito que é bo. Cal é o próximo? Agora necesitamos facer as cousas coa acción. Normalmente, cando escribir formularios HTML, tes que dicir onde vai enviar o formulario para. Por defecto, na maioría dos frameworks web, somete ao mesmo exacto, así que a cousa é, se publique unha solicitude GET a / blog / new, debe amosar-lle a forma, pero se enviar unha solicitude POST a / blog / novo cos datos, debe realmente intentar salvar este post e facer algo con el. O que imos facer é basicamente todo o que temos que facer para ver se é unha proposta post ou unha solicitude get é comprobar cales son as variables post pode definir. E se a variable cargo está definido, entón imos tentar crear un novo post. Unha vez máis, nós só facemos iso, e polo que se crea un novo post, e nós estamos indo literalmente para definir os seus campos como este, e logo, imos salvalo. E entón eu vou para redireccionar á páxina de índice para que se poidan ver a nosa lista de mensaxes. Imos tentar iso. Eu vou dicir: "Brandon" e, a continuación, enviar o post, e si todo vai ben, como se pode ver, el me redirixido á páxina do índice, e se eu vaia ata o final, temos un novo post inserida. Yay! Si, pregunta. [Estudante] E se tivese entrado exactamente a mesma cousa entrou antes? Será que comproba que non ten duplicado o mesmo submisión? Sexa por defecto, non, porque, por defecto - Sentímolo, a pregunta é se introducir nos mesmos datos en forma e alegan que, permitirá a inserción dun obxecto duplicado, unha entrada duplicada, esencialmente? Agora si, permitirá que faga iso, porque en bases de datos é perfectamente válido ter liñas totalmente duplicados, pero se isto é un problema, entón podes engadir validações, por exemplo, asegurarse de que, se este é exactamente o mesmo como algo que xa existe, logo dicir que é un obxecto válido, e entón pode incluso especificar a súa mensaxe de erro e dicir: "non é válido porque iso xa existe" ou algo parecido. Pero, neste caso, eu podería simplemente crear algo duplicado. Agora imos tratar de engadir algunhas validações. O problema con isto agora é que Podería literalmente enviar unha mensaxe completamente en branco. I pode premer neste botón, agora, e alí imos nós. Non pode realmente velo, pero esa liña extra aquí indica que, literalmente, ter un novo post. El só ten un autor en branco e un corpo en branco, e nós non queremos que a xente para facelo. Este é o lugar onde a validación vén dentro Eu podo ir ao meu modelo de obxecto, e agora eu creo unha nova función que especifica que as regras de validación que eu debería engadir a este modelo para asegurarse de que é válido ou para especificar o que significa ser un post válido? E quero dicir que non é máis que un post válido se o autor eo corpo non están en branco, e iso é como facelo en Kohana. Se crea unha nova función chamada "regras" e entón basicamente voltar un array asociativo que define as regras de validación para este obxecto. Estamos indo para volver a matriz, a continuación, o que imos facer é dicir "autor", que vai para unha matriz, que vai a outro array chamado "non está baleiro." E entón eu vou dicir "corpo". Vale, ea sintaxe para iso e estrutura para este pode parecer un pouco complicado e un pouco complicado. Se ler a documentación, é moi sinxelo de descubrir, Pero, esencialmente, iso é o que hai que facer para especificar algunhas regras de validación, e hai unha serie de regras distintas Kohana que lle vai dar de balde, como pode engadir regras para dicir debe ser polo menos este lonxitude. Quizais ten que ser numérico. Quizais teña que ser alfanumérico. Quizais que ten que ser, como máximo, este longo, así por diante e así por diante. Hai unha serie de regras distintas que Kohana ofrece para ti, e pode ir no seu sitio web, ollar para a documentación, e podes ver todas as cousas distintas que podes facer. Pero iso é todo o que teño que facer, e agora imos ver que pasa se eu enviar unha mensaxe en branco. O que vai ocorrer? Oh, non, eu recibín un erro. Recibo unha excepción de validación. Ben, iso é bo. El me dixo que o meu modelo non é válido, pero eu non quero poñer unha excepción para os meus usuarios cando tentan enviar algo incorrecto, non? Quero darlles algún tipo de mensaxe de erro agradable cando algo dá mal. O que imos facer é que imos envolver todo en un loop try catch. En realidade, eu creo que iso tamén é algo que aínda non aprendeu en CS50, xa C, a linguaxe de programación C, non ten excepcións, pero case todos os demais idioma ten excepcións, de xeito moi, moi brevemente, unha excepción é algo que unha peza de código pode lanzar unha excepción cando algo dá mal, pero entón quizais algún outro anaco de código máis arriba pode capturar esa excepción e facer algo con el. Por exemplo, neste caso, o anaco de código que está a tratar de salvar un modelo, el valida o modelo, e se di: "Vale, este modelo non é válido", que vai publicar unha excepción, e iso é unha especie de equivalente a en C que pode volver a -1 ou algo parecido. E entón, para min, esta función, o meu código a un nivel superior, podo tentar incorporarse esta excepción e, basicamente, dicir: "ben, se eu incorporarse á excepción, o que eu vou facer?" Ou eu podería optar por non capturar esa excepción e deixar alguén máis arriba capturar a excepción, ou se ninguén pega, entón todo o programa traba e di: "Algo deu mal, e eu non podía tratar con isto." Pero o que facemos é que enrole unha peza de código nun bloque try, e entón tamén engadir algo chamado un bloque catch, cal é o tipo de código que pode tentar capturar excepcións que se poidan producir. E entón se eu incorporarse esta excepción particular ou excepción invalidação, entón o que eu vou facer é Eu estou indo a definir os erros - Eu creo que é como fago iso - e eu estou indo a definir os erros dalgún obxecto. E entón, o que vou facer é se alcanza esa excepción, non está indo a redireccionar, e se non redireccionar, que vai saír do caso do blog e bater este blog / new, que é quere que quero facer. Se hai un erro, entón eu quero volver á forma e amosar eses erros. Agora o que quero facer é que quero pasar estes erros vista. Ok, eu creo que eu teño o punto de vista aquí, e, basicamente, quero amosar estes erros se os houbese. Antes de escribir o código HTML para iso, eu vou realmente rápido mostrar o que a estrutura deste erros miradas variables como, e esta é unha boa práctica en xeral. Moitas veces recibe algo de volta dalgún método, algunha función no ámbito web, e non sabe o que a variable parecer, así que non sabe como traballar con el. Vou usar un método de impresión r basicamente imprimir lo. E como podes ver, el me di que é unha matriz de asociado, e ten unha chave, autor, os puntos a esta corda, autor non pode estar baleiro, e outra chave, corpo, apunta a outra cadea, o corpo non pode estar baleiro. Eu son como, así, legal. Así que pode percorrer a matriz e imprimir cada mensaxe. É basicamente como unha matriz asociativa con unha morea de mensaxes. O que vou facer é "erros" e eu estou indo a crear unha lista non ordenada, e eu estou indo a percorrer os erros. E iso, e agora eu vou tentar presentar este novo, e imos ver o que temos. Agora temos esta boa lista de erros, e iso aínda é moi feo, pero iso, obviamente, pode ser formatado para unha boa aparencia, pero a idea básica é só en poucas liñas de código, fomos capaces de validar o noso modelo, asegúrese de que certos campos non estaban baleiras, e se algo deu mal, a continuación, voltar algún tipo de mensaxe de erro Podería, entón, presentar para o usuario. Tamén pode personalizar a súa validación de xeito que realmente pode ter unha mensaxe de erro que é máis específico para a súa aplicación, ou algo así. Todo o que é xeralmente personalizable. Por desgraza, estamos correndo contra o tempo, entón eu vou ter que cortar a sesión de codificación en directo aquí. Hai unha morea de outras características que quero demostrar para ti neste exemplo. Por exemplo, pode engadir modelos para a súa web, entón quizais haxa algún tipo de código HTML que quere aplicar para cada páxina no seu sitio web, e en vez de pegar que en cada ficheiro visión única que ten, o que obviamente sería unha mala práctica, basicamente pode definir eses modelos, e logo, no seu controlador dicir: "Ok, eu estou usando este modelo." "Ter todos os meus puntos de vista usar este modelo." E a última cousa que quero demostrar a ti tamén que non ten tempo para cross-site scripting, e, basicamente, eu creo que vostedes probablemente xa viu en CS50 - Eu creo que David Malan probablemente falou sobre como pode xeralmente inxectar O código JavaScript en - vostede falou sobre iso? Quizais? Quizais non? Pero moitas veces pode inxectar código JavaScript malicioso na base de datos de alguén, e se eles non escapan que correctamente, entón, cando eles presentan os datos de volta para o usuario, entón pode realizar algún tipo de código JavaScript acaso non quere que aconteza, e eu estaba indo a demostrar como faría iso dentro Kohana. É realmente moi, moi fácil. Podería facelo agora en 2 segundos literalmente. Todo o que tes que facer é basicamente romper esas cousas nesta cousa chamada entidades HTML. E iso vai escapar automaticamente todos os caracteres correctamente e asegúrese de non obter este problema. [Estudante] Inseriu a primeira proba de forma incorrecta. [Brandon Liu] Oh, oops. Ok, iso é todo o que eu tiña que compartir con vostedes hoxe. Estes diapositivas van ser publicadas, pero estes son xeralmente os únicos recursos que ten que realmente necesita para comezar co Kohana. Pode ir para o sitio. Teñen unha guía do usuario, e eles tamén teñen un explorador API. Podemos explorar todas as diferentes funcións e funcións auxiliares que teñen para ti. Eles xeralmente teñen información suficiente sobre o sitio web que pode usar para comezar e ir andando con Kohana. Non hai que moitos tutoriais, creo, para Kohana, fóra do o que teñen na páxina web aquí, entón este pode ser a súa mellor aposta. Pero se quere ir co framework web e non quere ter que incorporarse un novo idioma, e quere algo que é relativamente lixeiro e ten unha curva de aprendizaxe fácil, Quere definitivamente suxerir Kohana. Esta é probablemente a mellor oferta para iso. O máis divertido, con todo, é se estivésemos usando Ruby on Rails, poderiamos ter replicado o que fixemos e, probablemente, máis en menos de 3 minutos. Non é broma, pero aprender Ruby on Rails leva moito máis tempo do que sería necesario para aprender Kohana. É basicamente a súa elección sobre o que quere escoller para aprender, pero se queres comezar a traballar rapidamente, Kohana é sempre unha opción moi boa. Algunha última pregunta antes de rematar? Si [Estudante] Como poderiamos integrar este nun cadro CSS como estaba usando cando estaba instruíndo? A cuestión é como é que integramos que, cun cadro de CSS? Que probablemente quere facer é que probablemente incluiría un novo cartafol onde queremos botan todos os nosos arquivos CSS, e entón nós tamén quere engadir un novo modelo. No modelo de nós incluír eses arquivos CSS para asegurarse de que eles están referenciados en cada páxina, e entón cando realmente está escribindo HTML, que acaba de engadir clases e outros adornos adecuados, e, por exemplo, cando está a usar algo parecido coa forma función auxiliar, podes engadir máis parámetros despois para especificar cales clases quere ser conectado a varias cousas así poderían denominala lo correctamente, e iso é basicamente como ía. Algunha pregunta? Incrible. Grazas polo seu tempo, e grazas por ter benvida. Eu non estaba indo para engadir moito máis, pero unha cousa realmente rápida é que non temos unha ligazón a forma. Realmente burro. Imos engadir un - en realidade, a vista, blog, índice, imos moi rapidamente engadir unha ligazón que vai cara á nova páxina, a páxina onde podemos introducir un novo post. Nós imos facer. O que é bo é que hai todo este grupo de funcións auxiliares HTML que facer cousas distintas para vostede, entón xa viu as entidades funciona aquí, pero eles tamén teñen unha función chamada "Referencia", que se pode escribir no Blog / novo e dicir: "Publicar un novo blog." E sería crear este link para ti, e iso parece realmente sinxelo de se facer, pero iso é bo, porque supoño que está movendo a súa web a partir dun dominio a outro. E se acaba de escribir os URL a si mesmo, entón tería que cambiar todas as URLs Ou quizais cambiou-se a partir do 1 subcartafol para outra subcartafol. Vostede tería que cambiar todas as URLs a si mesmo, e iso non é divertido. Podes empregar esta áncora aquí, e pode cambiar o dominio ou o prefixo subcartafol no ficheiro de configuración unha vez máis, e logo, que vai aplicar iso en todas as partes, e iso é, unha vez máis, un gran exemplo de non repetir-se, secando o código para fóra. Onde queira que se está repetindo, e tentar extraer nalgún tipo de ficheiro de configuración ou a unha función diferente e telo tratar con isto para ti. E a última cousa que eu quería te amosar era Supoño que estamos de volta neste post, e eu compuxera algúns realmente longo ensaio, pero eu esquezo de engadir o meu autor. Agora, cando eu faga clic en "Enviar mensaxe" Acabo de perder todo. Non! Realmente triste. Entón, como trata sobre iso? Isto é o que nós facemos. Que facemos aquí é para estas funcións de entrada e área de texto, incluír un segundo parámetro, entón o valor de devandito segundo parámetro será o que o campo será cuberto inicialmente con. O que podemos facer é na nosa controlador blog, puidésemos chamar outra variable. Chamalo de "valores", quizais. E pasar na matriz post, literalmente. Isto significa que, se a validación fallou, pasar para min o cargo matriz que submeti desde o último solicitude, e de que xeito podo usar os valores da miña última presentación para repoboar os campos. Agora podo facer algo parecido con valores autor e valores do corpo, e así agora se eu fai algo aleatoria e prema en "Enviar mensaxe", el permanece alí. Pero imos a funcionar a outro problema. Isto funciona, pero se eu for á páxina por primeira vez, vai caer, e iso é porque a primeira vez imos á páxina, esta variable cargo aínda non foi definido. É nulo. Non existe. E o que queremos dicir é que si esta chave existir, logo voltar o valor desta matriz, pero se a chave non existir, a continuación, regresar unha cadea en branco. Esta é a característica que queremos aquí. Queremos comprobar se a chave existe antes de acceder á matriz, e, por sorte, o suficiente, Kohana tamén nos dá unha función auxiliar para iso. Teñen todo este conxunto de funcións baixo o nome de ARR, abreviación de matriz, e eles teñen unha función chamada "get" e pode pasar na matriz, e pode pasar o nome da chave. Entón, basicamente, o que vai facer é que vai obter a clave, pero se esa clave non existir na matriz, a continuación, el pode voltar en branco, ou tamén podemos especificar un patrón, eu creo, que é bo. Agora, se facemos o mesmo de novo, entón ve agora funciona na primeira vez, e de novo, se escribir algo aleatoria e tentar presentar, a continuación, el permanece alí. E eu creo que eu tamén podo amosar-lle como engadir un patrón moi rapidamente. Que podemos facer en primeiro lugar é que podemos engadir unha nova exhibición chamada "template.php" dentro do cartafol Views, eo que vou facer é que eu vou imprimir algo chamado "contido" cal será o meu contido principal. E quizais ben no fondo eu vou engadir, por exemplo, copyright. [Pregunta estudante inaudível] [Brandon Liu] Quizais este é un modelo moi básico que quero usar. Eu quero ter un cartafol cos meus dereitos de autor en cada páxina, e agora o que eu vou facer o meu controlador agora, en vez de dicir, "esténdese Controller" Eu vou dicir: "se estende Controller_Template" e agora, en vez de dicir, "corpo de resposta é igual a este punto de vista," Eu vou dicir: "este contido modelo -" e eu creo - podo poñer un sinal de igualdade? Eu esquezo. Si, eu penso así. E agora eu definir esa variable contido para igualar a vista. Eu podo facer o mesmo aquí. E agora, se eu actualizar, podes ver agora, este autor se engade alí, e só facer algúns post ao chou e despois, de novo, podes ver que o dereito de autor é na parte inferior da páxina. Grande. Isto é todo o que eu quería amosar para vós. [Aplausos] Algunha pregunta? [CS50.TV]