[Seminário] [Kohana: A Lightweight PHP Framework] [Liu Brandon] [Harvard University] [Isto é CS50.] [CS50.TV] Olá a todos. Meu nome é Brandon. Eu sou um júnior aqui na faculdade fazendo ciência da computação, e hoje vamos falar sobre Kohana, que é um framework de desenvolvimento web PHP. Hoje vai ser um seminário de codificação ao vivo, então eu estou basicamente vai gastar 5-10 minutos explicando o que Kohana é, e então eu estou literalmente indo para construir um blog super simples para você aqui literalmente do zero. Nós vamos fazer o download do código no site da Kohana, e vamos começar a construir um blog, e espero que ele vai ser muito instrutivo, porque você vai ver, talvez, talvez eu vou cometer alguns erros, e você verá me recuperar a partir deles, ou você vai ver o meu processo de pensamento como eu construir através deste blog, e enquanto isso, você também vai se familiarizar com o próprio quadro. Esperemos que ele vai ser um exercício muito instrutivo. Em primeiro lugar, o que exatamente é um framework? Se você estiver tomando CS50 até agora, você realmente não tenho trabalhado com qualquer Ainda estruturas, ea coisa é esta. Você provavelmente já fez um desenvolvimento web pset já, e digamos que você continuar a construir sites e manter a construção de websites. Você vai começar a notar algumas coisas. A primeira coisa que você vai notar é que você deve estar se fazendo as mesmas coisas uma e outra vez o tempo todo, coisas como a limpeza de dados de entrada do usuário, coisas como organizar seus arquivos de uma certa maneira. A outra coisa que você também provavelmente vai notar é que o seu código pode começar a ficar muito, muito confuso, e você pode deixá-lo confuso e só tem um tempo muito difícil mantê-lo, ou você pode começar a estruturar o seu código e torná-lo modular em determinadas maneiras de torná-lo mais sustentável. Este é o lugar onde frameworks web, basicamente, veio dentro Essas pessoas que haviam construído um monte de sites, segundo eles, "Nós não precisamos de refazer esta cada vez que construir um site." "Por que não vamos apenas fazer um pacote que faz todas estas coisas para você cada vez que você quiser construir um site? " E assim que quando você faz um novo site, você se concentrar apenas sobre o que exatamente este determinado site é sobre. Você não precisa repetir todas as várias configuração e separação de códigos e código de reescrever que muitas vezes você tem que fazer quando você está fazendo sites. A idéia é que um quadro permite que você escreva um código de nível superior sem ter que se preocupar com detalhes de nível inferior. Um detalhe de baixo nível pode ser algo como lidar com a limpeza de dados de entrada do usuário. Isso é algo que você não deve realmente precisa se preocupar. Você deve se concentrar no que a sua alocação web é realmente sobre. Ele elimina um monte de código clichê. É uma arquitetura para seu projeto. O mais popular seria Model-View-Controller, que eu vou falar em um segundo. E um monte de vezes, essas estruturas incorporam um conjunto de procedimentos, normas e as melhores práticas para que você use de modo que quando você adota o framework web você tem que escrever o código de uma certa maneira, e é geralmente um acordo sobre conjunto de princípios pela comunidade que é geralmente aceite para ser uma boa maneira de escrever código. Não faz o seu código mais sustentável, mais útil, assim por diante e assim por diante. E, finalmente, a coisa que eu quero enfatizar sobre enquadramentos contra bibliotecas é essa idéia de inversão de controle, ea coisa é esta. A diferença entre uma biblioteca e um quadro é que, com uma biblioteca você ainda está escrevendo o programa principal, e você está tipo de chamar a biblioteca e apelando para a biblioteca para fazer algo por você. A diferença entre uma biblioteca e um quadro é que o quadro começa com o controle, e invoca o seu código, assim você pode pensar nisso como - é por isso que ele é chamado de um quadro - a estrutura oferece este quadro e estrutura para o seu código, e preencher os buracos, e este ficará mais evidente na segunda quando você me vê começar a escrever código dentro do contexto do quadro. Você vai ver que eu estou preenchendo as lacunas, eo quadro é uma espécie de controle de todas as peças móveis, e eu tenho que colocar as peças nos lugares certos. Hoje vamos falar sobre Kohana, que é um dos muitos frameworks PHP. Existem frameworks web, e há aqueles em praticamente todas as línguas único, e eu estou pegando Kohana Kohana porque é indiscutivelmente e geralmente reconhecido como o quadro mais fácil PHP para pegar. É o mais leve. Há outros lá fora, que vêm com muitos, muitos mais recursos, mas eles tendem a ser mais difíceis de pegar. E, finalmente, Kohana utiliza a arquitetura MVC. É leve o suficiente para que nós pode literalmente construir um projeto aqui bem em frente de seus olhos, e você pode muito bem acompanhar com bastante facilidade. O que é a arquitetura MVC? Fica para o Model-View-Controller, e, talvez, se você pensar sobre o código que você tem escrito até agora para alguns de seus Série de Exercícios de desenvolvimento web você pode ser capaz de ver um pouco disso, mas geralmente quando você começar a escrever uma aplicação web mais complexas, a divisão entre estes três segmentos torna-se cada vez mais evidente. Eu coloquei o MVC aqui espécie de como uma pilha, e muitas vezes você vai ouvir as pessoas falarem sobre pilhas em desenvolvimento web, e isto é para ilustrar a ideia de que cada camada, cada componente realmente tenta se comunicar apenas entre dois outros componentes. Alguém acessa o seu site como um cliente ou um navegador. Eles interagem com o seu programa através do código vista. O código de visão interage com o controlador. O controlador interage com o modelo, e o modelo interage com a base de dados de SQL. E não há nenhum salto entre se você escrever o código corretamente. O que essas coisas fazem? O modelo é essencialmente a parte do código que lida com os seus dados. Tudo o que lida com o seu banco de dados, com os objetos que você armazena, ou recuperar os objetos no banco de dados, que está tudo tratado pelo modelo. Talvez você tem objetos em seu banco de dados. Nós vamos criar um modelo que tenha a ver as mensagens, assim um post pode ter alguns atributos para isso. Você pode ter funções em torno de armazenar essas mensagens ou recuperar mensagens ou filtrar os posts e assim por diante e assim por diante, e isso é todo o código que é tratado pelo modelo. O controlador é uma espécie de lógica do aplicativo, e um monte de coisas diferentes podem ir na lógica do aplicativo. Se você está falando com uma API diferente, que podem estar onde você está lidando com a lógica do aplicativo. Se você está tentando ter de trazer dados de vários modelos diferentes e têm a combiná-los de alguma forma, que muitas vezes pode ser tratada pelo controlador. Por exemplo, no Facebook, se você amigo de alguém, então talvez esse ato de estabelecer essa relação pode ser feito pelo controlador. E, finalmente, a visão é o código que está gerando o que você realmente vê. Muitas vezes eu penso nas Série de Exercícios CS50 eles realmente não incentivar vocês a separar estas três coisas. Você provavelmente vai ter este arquivo grande, longa, onde no topo você faz alguma consulta SQL e talvez fazer algum processamento sobre os dados obtidos a partir do banco de dados, e então você tem todo o seu HTML na parte inferior. E você pode achar que como você criar mais e mais páginas que você vai ter algum código de repetição, e também, a coisa é o arquivo fica muito grande e longa e torna-se difícil de gerir. A razão pela qual MVC é tão bem visto é por um número de razões. A primeira coisa é uma coisa chamada separação de interesses que é a idéia de que quando você tem - idealmente um pedaço de código deve fazer uma coisa e fazê-lo muito bem, e você não deve combinar peças de código que fazem coisas diferentes. Por exemplo, visualizar o código e código do modelo, eles realmente não têm de ser relacionados. Eles não tem que ser nos mesmos arquivos, então, quando você puder, para separá-los por isso é fácil de manter. A outra coisa é a reutilização de código. Você pode encontrar-se escrever a mesma consulta SQL ou fazer consultas semelhantes que podem ser abstraídas em uma função, e essa é a idéia por trás modelos e controladores, tê-lo em uma função separada que pode ser reutilizado em diferentes locais em seu projeto. E, finalmente, que está ligada a secagem do seu código, ou não repetir-se, não se repetir. Isso é muito compreensível em desenvolvimento. Sempre que puder, você não quer repetir a si mesmo, porque se você repetir-se,  é muito mais caro para manter. Se você quer mudar uma coisa, você tem que mudá-lo em todos os lugares, e que leva a erros, e é horrível. Tudo bem. Qualquer dúvida, até agora cerca de Kohana, afinal? Grande. Agora vamos mergulhar na sessão de codificação ao vivo, e espero que tudo corra bem. Vou construir basicamente este site em um dos meus servidores remotos, e de que maneira vocês podem também ver o site e acessar o site, e também o ambiente é melhor do que o meu configurado máquina remota, porque está rodando Linux em vez de OS X. Estamos, literalmente, vai começar. KohanaFramework.org. Eu estou indo para baixar o código do site. Vou copiar o endereço do link, ir para o meu servidor, baixá-lo, e eu estou indo para extraí-lo. [Estudante] O que é o maior que você pode fazer o texto? [Brandon Liu] Está melhor? [Estudante] É isso factível? [Brandon Liu] Sim, isso é bom. Eu baixei um arquivo ZIP e abriu o zíper que em um diretório chamado Kohana, e nós vamos mudar o nome que CS50-Kohana, e vamos lá dentro Incrível. Aqui você vê um monte de arquivos diferentes. A maioria de vocês pode ignorar - estamos não vai passar por todos os arquivos que estão aqui por causa de nossas limitações de tempo, mas geralmente quando você instala o Kohana, a primeira coisa que você faz é que você vá para o diretório, e você vai basicamente fazer alguns testes ambientais e outros enfeites certificar-se de seu ambiente está configurado corretamente para executar Kohana e certifique-se de que está tudo bem. Você pode ver a maioria das coisas se passaram, mas geralmente você sempre executar para esse problema 1 onde ele se queixa de que algum diretório não é gravável, e isso é por causa de algumas permissões. Eu não sei o quanto vocês aprenderam sobre permissões de arquivo em CS50, mas se você fizer de desenvolvimento web, você vai se deparar com este problema muito. Eu estou indo para torná-lo gravável e eu acho que eu também tenho que - lá vamos nós. Ok, então agora você pode ver tudo passou, e agora ele vai dizer para renomear o arquivo install.php. Vou mover o arquivo install.php para installed.php, e agora, se eu atualizar, dá-me algum erro, e é aí que a depuração vem dentro Este é o lugar onde você pode ver o que está realmente vai acontecer. A coisa é, por padrão, Kohana assume que seu projeto está no diretório raiz do seu domínio, por isso está esperando por você para ser a demo.brandonkliu.com. Temos de dizer que ele é realmente em uma subpasta. Está em uma subpasta chamada CS50 Kohana. A coisa é, ele está interpretando mal CS50-Kohana como qualquer outra coisa, que eu vou explicar para você em um segundo. Mas devo dizer-lhe que é algo que é de se esperar. O que nós vamos fazer é que nós estamos indo para ir para essa pasta chamado bootstrap.php, que é a pasta de configuração, onde um monte de coisas diferentes são criados. Eu abro isso. Então, talvez, uma das primeiras coisas que eu vou fazer é alterar o fuso horário. E então vamos ver. Aha! Bem aqui. Há um grupo de provérbios diferentes de configuração aqui, mas o que eu estou procurando é essa coisa chamada URL base, e, por padrão, eu entendo definido para Kohana, mas eu vou mudar isso para CS50-Kohana, e eu acho que deve corrigi-lo. Sim, ótimo. Por padrão, ao ver que ele está trabalhando, ele diz: "Olá Mundo". Onde é que isso veio? Como chegamos a Olá Mundo? Onde exatamente é o código que realmente escreveu isso? Para entender isso, vou apresentar este conceito chamado de roteamento. Praticamente todos os frameworks web tem o conceito chamado de roteamento, qual é a parte do software que irá mapear uma determinada URL a um determinado pedaço de código dentro do seu quadro. Por exemplo, se você tem alguma URL e você ir para algum URL como foo.com / blog / all em seguida, o que o quadro vai fazer - ou pelo menos o que Kohana vai fazer - é que vai encontrar uma classe chamada controlador de blog, e está indo para executar a função chamada ação todos. Eu sei que eu estou falando de classe e funções, e eu sei que vocês não cobrimos classes e funções em CS50 ainda, mas, por agora, você pode pensar em aulas como apenas um grupo de funções, uma forma de agrupar as funções em conjunto. Isso é realmente tudo o que você precisa saber. Agora, se olharmos para a nossa estrutura de pastas, dentro da pasta do aplicativo há uma outra pasta chamada classes e as outras pastas são chamadas de Controladoria e Modelo. Se você olhar dentro da pasta Controller, vemos que há um arquivo chamado Bem-vindo, e você pode ver aqui é uma classe chamada Controlador Bem-vindo, e há uma função chamada Índice Ação, eo que ele faz é que define o corpo de sua resposta a Olá Mundo. Isso é onde o código está sendo escrito. A outra questão é, bem, eu não ir para blah, blah, blah, / welcome / index. Como é que vim parar aqui? Bem, isso é simplesmente porque aqui na parte inferior do nosso arquivo de inicialização onde montamos nossas rotas você pode ver que eles definir alguns padrões para você. O controlador padrão é bem-vindo. A ação padrão é Index. É por isso que quando colocamos nada lá ele automaticamente foi para o controlador de Bem-vindo ea Acção índice. Tudo faz sentido até agora? Agora, você pode fazer mais do que apenas ir ao Controlador e uma ação específica. Você também pode passar parâmetros para o controlador. Apenas como exemplo, Eu estou indo para adicionar uma outra ação para este controlador para lhe mostrar. Vamos chamar esta ação Echo, porque ele vai lhe dizer o que você dá, e então eu estou basicamente vai pegar um parâmetro que vai ser enviada através de mim para o programa de roteamento, e como você pode ver aqui, esta linha bem aqui, você pode ver que isso basicamente significa que você tem controle, e você tem a /, e você tem ação, e você tem mais /, e que vai ser parâmetros, e porque temos este nome ID dentro de colchetes, o que significa que estamos nomeando este parâmetro ID. Mais tarde, no meu código do controlador, se eu quiser pegar um porão de que o parâmetro, Eu posso usar o código que eu escrevi, encontrar o parâmetro nomeado ID. Isso é o que eu fiz aqui, e eu vou voltar e dizer: "Você disse" isso. E agora, se eu for para o nosso site, Eu vou para cs50-kohana/welcome/echo/Helloooo-- oh, isso é certo. Existe um passo que deixei de fora. Isso faz parte da idéia de codificação ao vivo. Aqui está uma coisa. Vamos ver. Então, normalmente, por padrão, com um monte dessas aplicações web você tem que incluir essa coisa index.php na sua URL, porque a idéia é index.php é uma espécie de ponto de entrada de sua aplicação, mas é claro, que é uma espécie de chato ter. Você não quer ter index.php aparecer na sua URL, e praticamente todos os framework web fora da caixa tem este problema index.php, e então você tem que tomar algumas medidas para ser capaz de remover isso. E assim, neste caso, o que nós vamos fazer é que vamos usar um arquivo chamado. htaccess, e isso é algo que é específico para o servidor web Apache, e pode fazer coisas como reescrita de URLs e redirecionar URLs e assim por diante e assim por diante, e Kohana é bom o suficiente para fornecer um arquivo htaccess modelo. que podemos usar. Como você pode ver, há um arquivo lá chamado example.htaccess, e vamos copiar isso para. htaccess. Vou abrir este e editá-lo, e, basicamente, ele faz um monte de coisas diferentes. A linha de chave que você pode querer olhar é bem aqui. A idéia é que este estabelece uma regra que diz que, "Tudo bem, tudo o que você digita, preceder index.php para isso." Você pode ver isso. A. * Significa nada, corresponde a nada, e, em seguida, a segunda parte é index.php / $ 0, e US $ 0 refere-se a tudo o que foi combinado previamente. Será que isso faz sentido? Mas a coisa realmente fundamental eu quero mudar é mudar esta base de reescrita, que é a base de URL. É uma espécie de assume onde você está trabalhando. Eu estou indo para adicionar CS50 Kohana para que, e de que maneira, agora se eu remover o index.php, ele deve funcionar, e eu estou indo para adicionar alguns números para mostrar que ele realmente não funcionou. Parece bom. Todas as perguntas até agora? [Estudante] Como foi saber para fazer o 123? Isso é um argumento? Exatamente. Você pode pensar nisso como um argumento. Mas o mais estranho, porém, é que a forma como o faz Kohana é que eles não fazem isso exatamente como um argumento. Você tem que agarrá-lo assim. Você tem que pegar o objeto do pedido e pedir o parâmetro que é chamado ID, e que o nome vem do ID que arquivo de inicialização que eu mostrei antes, eo nome do ID era naqueles colchetes, e é assim que você pegar esses parâmetros. Incrível. Alguma outra pergunta? Como eu disse, os controladores, eles lidam com a lógica da aplicação, de modo que é um caso em que você pode ver isso é - é muito básico, mas ainda é a lógica da aplicação, a idéia de pegar o parâmetro e criar uma nova cadeia que diz: "Você disse que blá," e depois cuspindo que volta para você. E, geralmente, o que você faz é criar controladores diferentes. Você cria controladores separados para diferentes partes do seu site. Hoje vamos fazer um site muito simples, e isso vai ser um blog muito básico. Nós vamos fazer um novo controlador apenas para os cargos em um blog. Mas, então, se eu fosse para adicionar também os comentários ao post do blog, então eu provavelmente quer fazer um novo controlador para esses comentários. Se eu quisesse adicionar usuários, eu provavelmente gostaria de acrescentar um novo controlador para os usuários, e, em geral, a idéia é que sempre que você tem um novo modelo, um novo objeto de dados que você está lidando, você tem um único controlador para o objeto de dados. Hoje nós só vamos trabalhar com um objeto de dados, e que vai ser mensagens, e você também pode pensar em objetos de dados como correspondendo às tabelas. Geralmente cada tabela corresponde a um tipo de objeto de dados, assim a tabela de pós terá um modelo de post, que terá um controlador de pós correspondente a esse, e o mesmo para comentários, o mesmo para os utilizadores, e assim por diante e assim por diante. E isso é uma regra geral. Não vão haver casos especiais onde você pode ser diferente da que, mas 90% do tempo é o que você vai estar fazendo, e eu vou mostrar-lhe que é o que nós vamos fazer hoje. 1 mais conceito, antes de mergulhar de volta para o código, essa idéia de mapeamento objeto relacional. Vocês já fizeram um desenvolvimento pset web, e você viu que você faça uma consulta SQL, e tudo o que ele retorna a você são linhas. Você fica com essas linhas, e você indexá-los por algum nome, o nome da coluna e da tabela, e é assim que você trabalha com ele, e pode ser um pouco mais complicado. Mas além disso, se você tem relações dentro do seu banco de dados, como, por exemplo, se eu tiver comentários e posts, então talvez eu quiser pegar o post pai de um comentário. Se eu usar apenas linhas em SQL, então tudo o que posso chegar é o ID do post pai e não o próprio pós real. Mas quando estamos a codificação, o que nós realmente queremos é realmente agarrar  o pai colocar-se algumas vezes. O mapeamento objeto relacional faz é leva os resultados da consulta de banco de dados e coloca-lo em objetos para você, que são muito mais agradável para trabalhar com de matrizes simples e linhas. Por exemplo, agora, quando eu tiver um comentário, talvez, e eu quero agarrar seu posto pai, e eu talvez comentar pós seta, em seguida, ele vai realmente me dar o objeto pós correspondente ao cargo de pai real, e não apenas alguns ID, que eu teria de outra maneira de usar e fazer outra consulta SQL para pegar o post, que é pesado e desnecessária. E além disso, mapeando todas essas linhas de dados em objetos, Você também pode anexar mais funções aos objetos, assim, por exemplo, eu falei sobre como as classes são essencialmente grupos de funções. Você pode pensar assim. Por exemplo, talvez eu tenha esse objeto post, e talvez eu gostaria de ter algum tipo de função ligado a ele que, basicamente, diz-me que foi recentemente postou? Foi publicado na última semana, verdadeiro ou falso? E essa é uma função que eu possa anexar no objeto que, e é muito conveniente para tê-lo no mesmo lugar, e há uma série de funções diferentes que você pode criar para esses objetos, e é muito bom para ser capaz de anexá-lo a uma classe, a um objeto, enquanto que, se você só tinha linhas que vêm de seu banco de dados, então você realmente não pode anexar qualquer funcionalidade para isso. É, literalmente, apenas dados. Qualquer dúvida sobre isso em tudo? ORMs são o desenvolvimento web muito comum, e há um grande número de diferentes tipos de ORMs, Kohana e tem o seu próprio ORM. É muito básico, mas você vai ter um gostinho do que parece. Vamos criar um modelo para os nossos posts, ea primeira coisa que obviamente precisa fazer é criar uma tabela real dentro do nosso banco de dados para armazenar os nossos dados, na verdade, para esses lugares. A primeira coisa que vou fazer é ir ao phpMyAdmin. Vocês já usado phpMyAdmin antes? Ok, impressionante, então vocês já sabem o que é, e eu estou indo para criar uma nova tabela chamada Kohana Mensagens, e isso vai ser muito simples. Eu vou fazer o login para trás dentro Tudo o que nós vamos fazer hoje é ter um autor e um corpo, apenas mantê-la simples. Eu estou indo para criar essa tabela, e agora só temos uma tabela representando nossos posts com 2 campos para nosso autor e nosso corpo. A outra coisa que eu vou fazer agora é configurar minha aplicação web para que ele saiba como se conectar ao banco de dados, e este, mais uma vez, é algo que você vai ter que fazer com todos os aplicativos da web. Você tem que dizer a ele o nome de usuário ea senha e o nome da base de dados e assim por diante e assim por diante para descobrir como realmente se conectar ao seu banco de dados. Em Kohana, temos algo chamado um módulo de banco de dados, e na pasta de configuração temos esta pasta chamada Banco de Dados, e como você pode ver, há um monte de configurações que você tem que definir aqui para dizer o que é o nome de usuário ea senha para o banco de dados para que eu possa realmente se conectar a ele. E desde que eu não quero que vocês realmente sabem o nome de usuário e senha do meu banco de dados, Eu tenho um arquivo onde já definir tudo, e eu vou copiar e colá-lo sobre. Incrível. Okay. Acho que essa é toda a configuração que eu preciso fazer, mas vamos ver. Vamos continuar trabalhando nele, e se algo falhar, então nós vamos corrigi-lo. Agora o que eu vou fazer é que eu vou criar um novo controlador. Ou, na verdade, me desculpe. Primeiro eu tenho que criar um novo modelo. Eu vou criar um novo modelo chamado Post.php, eo que nós vamos fazer é que vamos chamá-lo de classe Model_Post. Obter algum destaque de sintaxe em, e assim, quando eu digo, "se estende ORM", que é basicamente um pouco mais de programação orientada a objetos, que, infelizmente, vocês não aprenderam em CS50 ainda, mas é muito fácil de pegar. Isso me dá toda esta funcionalidade extra que vem neste pacote ORM, e assim eu recebo um monte de funções extras e outras coisas de graça, que você vai ver um pouco em um segundo. Agora, na verdade, tudo o que eu preciso fazer é criar esta classe. Eu nem sequer precisa de fazer qualquer função ou qualquer coisa, mas eu criei uma classe que representa a tabela, e porque eu tenho estendido esta classe ORM, Eu recebo um monte de coisas de graça, então por enquanto você não tem que configurar algo mais para cima. E agora o que eu vou fazer é que eu vou criar um novo controlador, que eu vou citar blog.php, e eu vou copiar o controlador de boas-vindas então eu não tenho que redigitar algumas coisas, e agora eu tenho que mudar o nome deste. Agora o que eu vou fazer para testar para se certificar que tudo está dando certo, Eu vou pegar o primeiro post do meu banco de dados e imprimir o corpo da mensagem na tela. Para isso o que eu vou fazer primeiro é que eu vou guardar as mensagens a uma variável de modo que nós vamos fazer é - em Kohana o que você faz é pegar o objeto pós é meio complicado, mas você tem que fazer essa coisa chamada ORM :: fábrica, e então você passar o nome do modelo que você quer, e ele retorna o objeto ORM que representa esse modelo. E então, como eu disse, quando estendemos o objeto ORM, temos todos estes métodos de graça, assim, por exemplo, temos essa nova função chamada "encontrar todos", que retorna automaticamente cada post no banco de dados, o que é muito conveniente. E agora no corpo eu vou voltar o primeiro post e retornar seu corpo. E, claro, eu preciso criar um post, então vamos inserir um novo post. Eu vou dizer: "Brandon, o meu primeiro post." Incrível. E agora nós estamos indo para ir para blogs e se tudo funciona bem - oh, isso é alguma outra coisa de permissão de arquivo mudo novamente. Espere um segundo. É uma espécie de absurdo. Lá vamos nós. Okay. Eu que problema de permissão. Ele estava tentando criar alguns arquivos e alguns log, e as permissões, mais uma vez, não foram devidamente configurado, então eu fiz isso para que os arquivos foram gravável e executável para que ele pudesse realmente fazer logon às coisas. Agora ele está me dando outro ditado exceção ", classe ORM não encontrado" e isso é porque eu esqueci uma outra etapa. Isso é muito ruim. No arquivo de pasta de inicialização, existem estes módulos aqui, que você pode optar por ativar ou desativar. Trata-se de um monte de características diferentes que você pode optar por usar dentro de Kohana, que é uma espécie de bom. Por exemplo, eles têm um módulo de autenticação que você pode usar para autenticar usuários. Eles têm um módulo de armazenamento em cache, se você quiser implementar algum tipo de cache de back-end para fazer o trabalho de aplicação mais rápida e outros enfeites. Precisamos permitir que o banco de dados eo módulo ORM, porque como eu disse, estamos usando o banco de dados, obviamente, e nós também precisamos ativar o módulo ORM, porque nós gostaríamos de ter a funcionalidade extra, que é bom ter. Tudo o que tenho a fazer é descomentar essas duas linhas, e agora, se eu atualizar, ele me deu um outro erro. Ela diz: "Classe Model_Post não foi encontrado." Agora este é um problema bom de ter. Vamos ver. Torná-lo público. Não. Espere. Oh, querida. Eu não sei por que ele não é capaz de encontrar isso. Isso é muito estranho. Eu tenho essa classe bem aqui. Eu acho que eu poderia ter que - oh. Eu sou tão burro. Eu esqueci de adicionar um código PHP. É por isso. Agora eu tenho que desfazer essa mudança 1 eu fiz. Okay. Lá vamos nós. Isso foi muito bobo. Eu não tinha uma tag PHP abertura. Mas, como você pode ver, agora está funcionando corretamente, certo? Temos um post. Pegamos o primeiro post, e agora nós impresso seu corpo. Grande. Fantástico. Todas as perguntas até agora? Não.? Alguma pergunta? Ok, então nós acabamos de criar o modelo de post, muito básico, e nós vamos adicionar algumas funções mais tarde. Podemos adicionar validações e filtragem. As validações são uma das coisas que os quadros resolver para você muito, muito bem, e eu não acho que vocês tinham que fazer isso para o seu pset CS50, mas se você fizer de desenvolvimento web para o seu projeto final, você provavelmente vai querer fazer algum tipo de validação, como não ter nomes de usuário em branco, talvez ter uma senha com pelo menos algum tempo, coisas assim. E é realmente complicado de implementar essas coisas por nós mesmos, e praticamente todos os framework web único faz isso por você e permite que você faça isso de uma maneira muito limpa. E o modelo é o lugar onde você geralmente expressar essas regras de validação, porque é validar se um modelo é válido ou não. Mas, por agora, vamos colocar isso até mais tarde, e por enquanto vamos trabalhar em outra parte, e vamos tentar fazer uma nova visão que lista todas as mensagens. As etapas envolvidas na tomada de uma nova ação para listar todas as mensagens é pegar uma lista de todas as mensagens e, em seguida, tornar a lista de todas as mensagens através de um ponto de vista. Aqui, felizmente o suficiente, já pegou todas as mensagens usando esta primeira linha, a encontrar todas as funções, e agora o que vamos fazer é até agora Eu tenho vindo a estabelecer diretamente o corpo da resposta passando a corda, mas agora eu quero usar um ponto de vista, ea diferença entre uma vista e apenas fazendo isso está com uma visão que eu possa ter um bom, modelo grande HTML, eo que eu posso fazer é passar algumas variáveis e, em seguida, ter a visão de preencher automaticamente o seu modelo usando essas variáveis. O que eu vou fazer é que eu vou criar um novo ponto de vista, e eu vou citar o ponto de vista algo como "Blog / index" e eu vou ligar basicamente isso - oh, o que estou escrevendo? Meu cérebro está em outro lugar. Vou ligar as variáveis ​​para a exibição mensagens, de modo que forma o ponto de vista tem acesso a esta variável post. E agora eu preciso para criar esse ponto de vista, então aqui temos esta pasta chamada "Visto", e em primeiro lugar, eu vou criar uma nova pasta em que chamado "Blog". Isso é bom. Dessa forma, podemos ter uma hierarquia agradável para os nossos pontos de vista. E então eu vou criar outro arquivo lá chamado de "index.php". Incrível. Na verdade, vamos ter os dois aqui. Fazendo um arquivo de visão, provavelmente é a parte mais simples de tudo isso, e estas são provavelmente as coisas que você já está familiarizado. Nós vamos fazer algo muito simples, começar a dizer: "A minha lista de posts do blog." Então, podemos passar, e nós pode percorrer a matriz mensagens, agarrar cada post e dizer algo como - talvez adicionar uma linha e, em seguida, imprimir o autor eo corpo. Isso faz sentido até agora? E vamos ver se funciona. Não aconteceu nada. Eu me pergunto por quê. Oh, eu perdi um passo. Muito bobo de mim. Eu criei um ponto de vista, mas eu não definir a vista como a resposta, então você tem que fazer mais uma coisa. Você tem que fazer ", este corpo de resposta" e configurá-lo para ser a vista. Lá vamos nós. Temos nosso campo, e então temos um post, e apenas por diversão, vamos inserir um outro post para que possamos ver uma lista. E inserir estas duas mensagens, e agora se eu atualizar a página, vemos todos esses posts aqui. Será que faz sentido até agora? Sim, uma pergunta? Oh, tudo bem. Como você pode ver, temos sido capazes de separar todos estes códigos para fora em seções diferentes, e então você pode ver que é mais claro, com o código de ponto de vista. Este arquivo aqui que representa o ponto de vista, ele só se preocupa com a representação de dados, exibindo dados. Ele é passado algum tipo de dados, e tudo que ele faz é apenas mostrá-lo a você. Em todas as outras partes de seu código, você não terá que se preocupar com nada disso, e da mesma forma, o seu código de vista não tem que preocupar-se sobre qualquer coisa como acessar o banco de dados e assim por diante e assim por diante, o que é muito bom e faz com que o seu código muito mais fácil de manter. Como eu disse, pontos de vista, eles são dinâmicos em que é um arquivo, mas ele iria gerar diferentes pontos de vista com base nas variáveis ​​que você realmente passar em, e, além disso, há um grande número de diferentes funções auxiliares que você pode usar para ajudá-lo a escrever o seu código mais rápido, que eu vou lhe mostrar em apenas um segundo. É. [Estudante] Então $ 0 é um controlador, certo? Essa segunda coisa. A pergunta é é de R $ 0 a controlador? $ 0 é uma variável que eu criei aqui. Eu criei uma visão de primeira. Eu atribuído a alguma variável. Então, eu passei para esta função, defina-o como o corpo da resposta. Será que isso faz sentido? [Estudante] Então, é vista :: factory, é vista como uma classe ou uma biblioteca [inaudível] função de fábrica? A questão é sobre a função de visualização :: fábrica, e, basicamente, este é um pouco mais de programação orientada a objetos essencialmente. Ver é a classe vista, e ele tem um método chamado "Fábrica" e isso é uma maneira de agarrar o objeto que está com o nome "Blog / index." E isso é mais um pouco de material de programação orientada a objeto que eu não vou entrar aqui muito. Agora, obviamente, queremos criar novas mensagens, mas não quero ter que fazê-lo por meio de um banco de dados, então vamos criar uma nova ação para a criação de um novo post, e há um monte de coisas que temos que fazer. A primeira coisa que vamos fazer - vamos enfrentar essas coisas um por um. A primeira coisa que vamos fazer é que temos que criar um formulário para a inserção de um novo post, mas eu também estou indo para adicionar uma nova ação em primeiro lugar, assim que adicionar uma nova ação é tão fácil como adicionando uma nova função com seu controlador, e agora eu vou fazer algo muito básico, basta pegar esse ponto de vista e publicá-lo, basta indicá-lo para você. E então agora eu vou criar um novo arquivo de ponto de vista, e eu vou começar a escrever algumas coisas. O que é agradável sobre Kohana é que eles fornecem um monte de diferentes funções auxiliares para você escrever código vista com mais facilidade, e uma dessas funções auxiliares ou módulos auxiliares está em torno de formas de escrever. Para escrever as formas, eu realmente não tenho que escrever diretamente qualquer HTML mim. Vocês escreveram formulários HTML. Você sabe como ele pode ser muito, muito doloroso e complicado para escrever formas. Não é divertido, por isso, felizmente, podemos basicamente escrever um formulário usando Kohana do formar funções auxiliares para fazer isso por nós. Nós estamos indo para basicamente ter campos para cada coisa que temos, assim um para autores e outro para os corpos. Nós vamos ter um rótulo, e nós vamos ter uma entrada. E então, finalmente, nós vamos ter uma submissão. E como você pode ver, este é muito mais limpo para escrever do que tudo o que HTML bagunçado, o que é bem legal. Concedido, há outros frameworks web que têm ainda mais limpo do que isso, mas pelo menos é melhor do que escrever o código HTML mesmo. Impressionante, então é isso que você vê. Isso é meio confuso, então eu estou indo para adicionar uma quebra de linha não para fazer esse olhar um pouco mais agradável. Bem, é claro, ele ainda parece muito, muito ruim, mas nós estamos apenas focados na funcionalidade de agora e não na estética. Sem tempo para fazer tudo. E como você pode ver, agora temos uma forma de super básico, o que é bem legal. Este código eu diria que é mais limpo do que tentando escrever um HTML formar-se, de modo que é bom. Qual é o próximo? Agora precisamos fazer as coisas com a ação. Normalmente, quando você escrever formulários HTML, você tem que dizer onde ele vai enviar o formulário para. Por padrão, na maioria dos frameworks web, submete ao mesmo exato, assim que a coisa é, se você enviar uma solicitação GET para / blog / new, ele deve mostrar-lhe a forma, mas se você enviar uma solicitação POST para / blog / novo com os dados, ele deve realmente tentar salvar esse post e fazer algo com ele. O que vamos fazer é basicamente tudo o que temos que fazer para verificar se é um pedido post ou uma solicitação get é verificar quais são as variáveis ​​post você pode definir. E se a variável cargo está definido, então vamos tentar criar um novo post. Mais uma vez, nós apenas fazemos isso, e que cria um novo post, e nós estamos indo literalmente para definir seus campos como este, e, em seguida, vamos salvá-lo. E então eu vou para redirecionar para a página de índice para que eles possam ver a nossa lista de mensagens novamente. Vamos tentar isso. Eu vou dizer: "Brandon" e, em seguida, enviar o post, e se tudo correr bem, como você pode ver, ele me redirecionado para a página do índice, e se eu vá até o final, temos um novo post inserido. Yay! Sim, pergunta. [Estudante] E se você tivesse entrado exatamente a mesma coisa você entrou antes? Será que ela verifique se você não tiver duplicado a mesma submissão? Seja por defeito, não, porque, por padrão - desculpe, a pergunta é se inserir nos mesmos dados na forma e alegam que, vai permitir a inserção de um objeto duplicado, uma entrada duplicada, essencialmente? Agora, sim, ele irá permitir que você faça isso, porque em bancos de dados é perfeitamente válido ter linhas completamente duplicados, mas se isso for um problema, então você pode adicionar validações, por exemplo, certificar-se de que, se este é exatamente o mesmo como algo que já existe, em seguida, dizer que é um objeto inválido, e então você pode até mesmo especificar sua mensagem de erro e dizer: "inválido porque isso já existe" ou algo parecido. Mas, neste caso, eu poderia simplesmente criar algo duplicado. Agora vamos tentar adicionar algumas validações. O problema com isto agora é que Eu poderia literalmente enviar uma mensagem completamente em branco. I pode clicar nesse botão, agora, e lá vamos nós. Você não pode realmente vê-lo, mas essa linha extra aqui indica que eu, literalmente, ter um novo post. Ele só tem um autor em branco e um corpo em branco, e nós não queremos que as pessoas para fazer isso. Este é o lugar onde a validação vem dentro Eu posso ir para o meu modelo de objeto, e agora eu posso adicionar uma nova função que especifica quais as regras de validação que eu deveria adicionar a este modelo para se certificar de que ele é válido ou para especificar o que significa ser um pós válido? E eu quero dizer que é apenas um post válido se o autor eo corpo não estão em branco, e isso é como fazê-lo em Kohana. Você cria uma nova função chamada "regras" e então você basicamente retornar um array associativo que define as regras de validação para este objeto. Nós estamos indo para retornar a matriz, em seguida, o que vamos fazer é dizer "autor", ele vai para uma matriz, que vai para outro array chamado "não está vazio." E então eu vou dizer "corpo". Ok, ea sintaxe para isso e estrutura para este pode parecer um pouco complicado e um pouco complicado. Se você ler a documentação, é bastante simples de descobrir, Mas, essencialmente, é isso que você precisa fazer para especificar algumas regras de validação, e há uma série de regras diferentes Kohana que vai lhe dar de graça, como você pode adicionar regras para dizer deve ser pelo menos este comprimento. Talvez ele tem que ser numérico. Talvez tenha que ser alfanumérico. Talvez que tem de ser, no máximo, este comprimento, assim por diante e assim por diante. Há uma série de regras diferentes que Kohana fornece para você, e você pode ir em seu site, olhar para a documentação, e você pode ver todas as coisas diferentes que você pode fazer. Mas isso é tudo o que tenho que fazer, e agora vamos ver o que acontece se eu enviar uma mensagem em branco. O que vai acontecer? Oh, não, eu recebo um erro. Eu recebo uma exceção de validação. Bem, isso é bom. Ele me disse que o meu modelo é inválido, mas eu não quero mostrar uma exceção para meus usuários quando eles tentam enviar algo inválido, certo? Quero dar-lhes algum tipo de mensagem de erro amigável quando algo dá errado. O que nós vamos fazer é que vamos embrulhar tudo em um loop try catch. Na verdade, eu acho que isso também é algo que você ainda não aprendeu em CS50, porque C, a linguagem de programação C, não tem exceções, mas quase todos os outros idioma tem exceções, de modo muito, muito brevemente, uma exceção é algo que um pedaço de código pode lançar uma exceção quando algo dá errado, mas então talvez algum outro pedaço de código mais acima pode capturar essa exceção e fazer algo com ele. Por exemplo, neste caso, o pedaço de código que está tentando salvar um modelo, ele valida o modelo, e se diz: "Ok, este modelo não é válido", que vai lançar uma exceção, e isso é uma espécie de equivalente a em C que você pode voltar a -1 ou algo parecido. E então, para mim, esta função, o meu código a um nível superior, posso tentar pegar essa exceção e, basicamente, dizer: "Ok, se eu pegar a exceção, o que eu vou fazer?" Ou eu poderia optar por não capturar essa exceção e deixe alguém mais acima capturar a exceção, ou se ninguém pega, então todo o programa trava e diz: "Algo deu errado, e eu não podia lidar com isso." Mas o que fazemos é que você enrole um pedaço de código em um bloco try, e então você também adicionar algo chamado um bloco catch, qual é o tipo de código que irá tentar capturar exceções que possam ocorrer. E então se eu pegar essa exceção especial ou exceção invalidação, então o que eu vou fazer é Eu estou indo para definir os erros - Eu acho que é como eu faço isso - e eu estou indo para definir os erros de algum objeto. E então, o que eu vou fazer é se ela atinge essa exceção, ele não está indo para redirecionar, e se não redirecionar, ele vai sair do caso do blog e bater esse blog / new, que é quer que eu quero fazer. Se houver um erro, então eu quero voltar à forma e exibir esses erros. Agora o que eu quero fazer é que eu quero passar esses erros à vista. Ok, eu acho que eu tenho o ponto de vista aqui, e, basicamente, eu quero mostrar esses erros se existirem. Antes de eu escrever o código HTML para isso, eu vou realmente rapidamente mostrar o que a estrutura deste erros olhares variáveis ​​como, e esta é uma boa prática em geral. Muitas vezes você recebe algo de volta de algum método, alguma função no âmbito web, e você não sabe o que a variável parece, assim você não sabe como trabalhar com ele. Eu vou usar um método de impressão r basicamente imprimi-lo. E como você pode ver, ele me diz que é uma matriz de associado, e você tem uma chave, autor, os pontos a esta corda, autor não pode estar vazio, e uma outra chave, corpo, aponta para outra cadeia, o corpo não pode estar vazio. Eu sou como, bem, legal. Então eu pode percorrer a matriz e imprimir cada mensagem. É basicamente como uma matriz associativa com um monte de mensagens. O que eu vou fazer é "se erros" e eu estou indo para criar uma lista não ordenada, e eu estou indo para percorrer todos os erros. E isso, e agora eu vou tentar apresentar este novo, e vamos ver o que temos. Agora temos essa boa lista de erros, e isso ainda é muito feio, mas isso, obviamente, pode ser formatado para uma boa aparência, mas a idéia básica é apenas em poucas linhas de código, fomos capazes de validar o nosso modelo, certifique-se de que certos campos não estavam vazias, e se algo deu errado, em seguida, retornar algum tipo de mensagem de erro Eu poderia, então, apresentar para o usuário. Você também pode personalizar a sua validação de modo que você pode realmente ter uma mensagem de erro que é mais específico para a sua aplicação, ou algo assim. Tudo o que é geralmente personalizável. Infelizmente, estamos correndo contra o tempo, então eu vou ter que cortar a sessão de codificação ao vivo aqui. Há um monte de outras características que eu quero demonstrar para você neste exemplo. Por exemplo, você pode adicionar modelos para o seu site, então talvez haja algum tipo de código HTML que você deseja aplicar para cada página em seu site, e em vez de colar que em cada arquivo visão única que você tem, o que obviamente seria uma má prática, basicamente você pode definir esses modelos, e, em seguida, em seu controlador dizer: "Ok, eu estou usando esse modelo." "Ter todos os meus pontos de vista usar esse modelo." E a última coisa que eu quero demonstrar a você também que não tem tempo para se cross-site scripting, e, basicamente, eu acho que vocês provavelmente já viu em CS50 - Eu acho que David Malan provavelmente falou sobre como você pode geralmente injetar O código JavaScript em - você falou sobre isso? Talvez? Talvez não? Mas muitas vezes você pode injetar código JavaScript malicioso no banco de dados de alguém, e se eles não escapam que corretamente, então, quando eles apresentam os dados de volta para o usuário, então ele pode executar algum tipo de código JavaScript acaso você não quer que aconteça, e eu estava indo para demonstrar como você faria isso dentro Kohana. É realmente muito, muito fácil. Eu poderia fazê-lo agora em 2 segundos literalmente. Tudo que você tem a fazer é basicamente quebrar essas coisas nesta coisa chamada entidades HTML. E isso vai escapar automaticamente todos os caracteres corretamente e certifique-se de não obter este problema. [Estudante] Você digitou o primeiro teste de forma incorreta. [Brandon Liu] Oh, oops. Ok, isso é tudo o que eu tinha que compartilhar com vocês hoje. Esses slides vão ser publicadas, mas estes são geralmente os únicos recursos que você deve realmente precisa para começar com o Kohana. Você pode ir para o site. Eles têm um guia do usuário, e eles também têm um explorador API. Podemos explorar todas as diferentes funções e funções auxiliares que eles têm para você. Eles geralmente têm informações suficientes sobre o site que você pode usar para começar e ir andando com Kohana. Não há que muitos tutoriais, eu acho, para Kohana, fora do o que eles têm no site aqui, então este é provavelmente a sua melhor aposta. Mas se você quer ir com o framework web e você não quer ter que pegar uma nova língua, e você quer algo que é relativamente leve e tem uma curva de aprendizagem fácil, Gostaria definitivamente sugerir Kohana. Essa é provavelmente a melhor oferta para isso. O mais engraçado, porém, é se estivéssemos usando Ruby on Rails, poderíamos ter replicado o que nós fizemos e, provavelmente, mais em menos de 3 minutos. Não é brincadeira, mas aprender Ruby on Rails leva muito mais tempo do que seria necessário para aprender Kohana. É basicamente a sua escolha sobre o que você quer escolher para aprender, mas se você quiser começar a trabalhar rapidamente, Kohana é definitivamente uma escolha muito boa. Alguma última pergunta antes de terminar? Sim. [Estudante] Como poderíamos integrar esse num quadro CSS como você estava usando quando você estava instruindo? A questão é como é que integramos que, com um quadro de CSS? O que provavelmente gostaria de fazer é que provavelmente incluiria uma nova pasta onde gostaríamos de despejar todos os nossos arquivos CSS, e então nós também gostaria de acrescentar um novo modelo. No modelo de nós incluir esses arquivos CSS para se certificar de que eles estão referenciados em cada página, e então quando você realmente está escrevendo HTML, que você acabou de adicionar classes e outros enfeites adequados, e, por exemplo, quando você está usando algo parecido com a forma função auxiliar, você pode adicionar mais parâmetros depois para especificar quais classes você quer ser ligado a várias coisas assim eles poderiam denominá-lo corretamente, e isso é basicamente como você iria. Alguma outra pergunta? Incrível. Obrigado pelo seu tempo, e obrigado por ter vindo. Eu não estava indo para adicionar muito mais, mas uma coisa realmente rápida é que não temos um link a forma. Realmente burro. Vamos adicionar um - na verdade, a vista, blog, índice, vamos muito rapidamente adicionar um link que vai para a nova página, a página onde podemos inserir um novo post. Nós vamos fazer isso. O que é bom é que há todo este grupo de funções auxiliares HTML que fazer coisas diferentes para você, então você já viu as entidades funcionar aqui, mas eles também têm uma função chamada "âncora", qual você pode digitar no Blog / novo e dizer: "Publicar um novo blog." E seria criar esse link para você, e isso parece realmente simples de se fazer, mas isso é bom, porque suponho que você está movendo o seu site a partir de um domínio para outro. E se você acabou de escrever os URLs a si mesmo, então você teria que mudar todas as URLs. Ou talvez você mudou-se a partir de 1 subpasta para outra subpasta. Você teria que mudar todas as URLs a si mesmo, e isso não é divertido. Você pode usar essa âncora aqui, e você pode mudar o domínio ou o prefixo subpasta no arquivo de configuração uma vez, e, em seguida, ele vai aplicar isso em todos os lugares, e isso é, mais uma vez, um grande exemplo de não repetir-se, secando o seu código para fora. Onde quer que você está se repetindo, e tentar extrair em algum tipo de arquivo de configuração ou para uma função diferente e tê-lo lidar com isso para você. E a última coisa que eu queria te mostrar era Suponho que estamos de volta neste post, e eu tinha composto alguns realmente longo ensaio, mas eu esqueci de incluir o meu autor. Agora, quando eu clique em "Enviar Mensagem" Acabo de perder tudo. Não! Realmente triste. Então, como você lida com isso? Isto é o que nós fazemos. O que fazemos aqui é para essas funções de entrada e área de texto, se incluir um segundo parâmetro, então o valor do referido segundo parâmetro vai ser o que o campo vai ser preenchido inicialmente com. O que podemos fazer é em nosso controlador blog, pudéssemos ligar outra variável. Chamá-lo de "valores", talvez. E passar na matriz post, literalmente. Isso significa que, se a validação falhou, passar para mim o cargo matriz que eu submeti a partir do último pedido, e de que maneira eu posso usar os valores da minha última apresentação de para repovoar os campos. Agora eu posso fazer algo parecido com valores autor e valores do corpo, e assim agora se eu fizer alguma coisa aleatória e clique em "Enviar Mensagem", então ele permanece lá. Mas vamos a correr para um outro problema. Isso funciona, mas se eu for para a página pela primeira vez, ele vai cair, e isso é porque a primeira vez vamos para a página, esta variável cargo ainda não foi definido. É nulo. Ela não existe. E o que queremos dizer é que se esta chave existir, em seguida, retornar o valor desta matriz, mas se a chave não existir, em seguida, retornar uma cadeia em branco. Essa é a funcionalidade que queremos aqui. Queremos verificar se a chave existe antes de tentar acessar a matriz, e, felizmente, o suficiente, Kohana também nos dá uma função auxiliar para isso. Eles têm todo esse conjunto de funções sob o nome de ARR, abreviação de matriz, e eles têm uma função chamada "get" e você pode passar na matriz, e você pode passar o nome da chave. Então, basicamente, o que ele vai fazer é que vai tentar obter a chave, mas se essa chave não existir na matriz, em seguida, ele irá retornar em branco, ou também podemos especificar um padrão, eu creio, que é bom. Agora, se fizermos a mesma coisa de novo, então você vê agora ele funciona na primeira vez, e novamente, se digitar alguma coisa aleatória e tentar apresentar, em seguida, ele permanece lá. E eu acho que eu também posso mostrar-lhe como adicionar um modelo muito rapidamente. O que podemos fazer em primeiro lugar é que podemos adicionar uma nova exibição chamada "template.php" dentro da pasta Views, eo que eu vou fazer é que eu vou imprimir algo chamado "conteúdo" qual vai ser o meu conteúdo principal. E talvez bem no fundo eu vou adicionar, digamos, copyright. [Pergunta estudante inaudível] [Brandon Liu] Talvez este é um modelo muito básico que eu quero usar. Eu quero ter uma pasta com os meus direitos autorais em cada página, e agora o que eu vou fazer no meu controlador é agora, em vez de dizer, "se estende Controller" Eu vou dizer: "se estende Controller_Template" e agora, em vez de dizer, "corpo de resposta é igual a este ponto de vista," Eu vou dizer: "este conteúdo modelo é -" e eu acho - posso colocar um sinal de igualdade? Eu esqueço. Sim, eu pensei assim. E agora eu definir essa variável conteúdo para igualar a vista. Eu posso fazer o mesmo aqui. E agora, se eu atualizar, você pode ver agora, este autor é adicionado lá, e apenas fazer alguns post aleatório e depois, novamente, você verá que o direito autoral é na parte inferior da página. Grande. Isso é tudo o que eu queria mostrar para vocês. [Aplausos] Alguma pergunta? [CS50.TV]