>> Para começar a construir uma ponte que pode ser a sua única experiência
com programação web, o que eu pensei que eu iria fazer é roubar um casal
dos exemplos que pode ter visto em 50
se você tomou no passado ano ou dois, ou pode não ter
se você tomou há alguns anos atrás
que são pequenos passos em direção a a piridina saber como MBC,
Model View Controller, eo que isso significa?
Isso é que vamos ver novamente talvez é apenas uma maneira de partida
para limpar o desenho de alguns peça baseada na Web de software,
ou pode ser do lado do cliente base, bem como, mas vamos usá-lo
no contexto de PHP, para que possamos começar
para tornar mais complexa projetos e tipo
de tipos diferentes de distintos código dentro do aplicativo;
particularmente, de modo que quando tem várias pessoas trabalhando
em um projeto que é muito mais fácil para desenhar linhas.
Então, primeiro vamos dar uma olhar para uma forma sub-ótima
de implementar algo.
Suponha que eu queria fazer um super website curso simples para 50
ou qualquer outro tipo, e essa classe tem coisas
como palestras e um plano de estudos.
Eu poderia fazer algo como um tag h1 no topo da minha página
e uma lista não ordenada com itens da lista li em ordem
apenas para ter uma lista com marcadores de opções de menu, de modo super simples.
Então, como podemos fazer isso?
Bem, deixe-me ir para o meu janela de terminal aqui,
e perceber que eu tenho uma leitura me e vamos vincular a este código
no site da Claro daqui a pouco,
e perceber que eu tenho índice ponto htm - php índice ponto.
Então deixe-me ir em frente e abrir que, e com certeza é uma espécie
bobo que este mesmo chamado php
porque tudo o que tenho é um comentário php
e depois tudo o resto é apenas código html cru.
Mas, novamente, esta é a versão zero,
assim um passo para algo mais interessante,
de notar que eu codificado CS50 como o título, CS50 no h1,
e agora eu tenho a ligação de palestras,
agora eu tenho o link syllabus.
Tudo bem, de modo que não parece tão irracional
até que você siga um link como palestras, e você percebe
Tudo bem que é diferente conteúdo, mas é meio
da mesma coisa; É um título da página e lista não ordenada.
Clico semana zero, a partir de no ano passado, e é uma espécie
da mesma coisa, um h1 tag e uma lista não ordenada
e, finalmente, eu clico isso, e eu chegar a algumas folhas,
que é os slides que aula particular.
Então, algo me diz Estou prestes a encolher.
Se eu abrir palestras dot aviso php
que é praticamente cópia e cole a partir do arquivo anterior;
Eu só mudou o título para h1, eo que estas ligações são.
Pior ainda, se eu for em semana de zero ponto php,
é o mesmo trabalho de cópia pasta
com apenas um pouco de conteúdo alterados.
Assim, certamente há uma oportunidade aqui para melhorar,
e certamente isso deve ser uma boa regra de ouro;
sempre que você sentir copiando a si mesmo
e colando algo talvez mais do que uma vez,
bandeiras vermelhas devem espero começar a sair.
Mas como é que vamos sobre como melhorar isso?
Bem, há algumas maneiras, e as técnicas que você pode usar
em php têm evoluído ao longo tempo, mas vamos tentar este.
Deixe-me entrar em versão um, assim que a próxima iteração deste,
e deixe-me tentar limpá-lo um pouco.
Certo, uma das php de mecanismos mais simples
para resolver este problema é a velha escola requerem função,
o que praticamente faz uma cópia e pasta dos conteúdos
de algum arquivo aqui, como c é nítida incluem,
e outras línguas têm construções muito similares.
Portanto, parece um pouco estranho agora,
definitivamente não é um completar olhando página web,
mas provavelmente o que é dentro de php header ponto.
Todas as outras coisas, à direita, a tag html, a tag cabeça,
o título de tag, todas as coisas que estava acima da essência principal
da página, que é sem dúvida apenas a lista não-ordenada,
e no rodapé é provavelmente como a tag de corpo fechado,
tag do html fechado; bastante desinteressante
mas coisas duplicação.
Tudo bem, e com certeza suficiente, se eu for
em cabeçalho dot php é apenas tipo do fragmento órfão
a partir do topo, e se eu entrar em rodapé dot php,
É o órfão fragmento a partir da parte inferior,
e eu estou usando os mesmos fragmentos em meus outros arquivos,
como palestras dot php.
Tudo bem, então o que há de melhor sobre o que você diria?
Sim?
>> Simplicidade.
>> Simplicidade?
Eu não sei este tipo de aparência muito mais assustador para mim agora, certo?
>> Se eu quisesse mudar sua cabeçalho, você não teria
para mudá-la em toda a anterior como arquivos.
Você só alterá-lo em seu cabeçalho.
>> Exatamente, por isso, talvez em Nesse sentido, é mais simples,
talvez eu enquadrá-lo como ele é só que é mais fácil para atualizá-lo.
É talvez um pouco mais limpo
porque você atualizar isso em um só lugar.
Então, isso é muito convincente; o que é uma desvantagem
desta abordagem ou O que resta problema
que não temos realmente resolvido?
Sim?
[Comentário Off Mic]
Sim, exatamente, eu quero dizer, eu sou ainda copiar e colar;
é um pouco menos, mas eu só puxado para cima de dois desses arquivos,
e eles praticamente ainda parecia idêntico.
Houve um requerem a topo, um requerem na parte inferior,
e um não-ordenada lista no meio
ainda que por si só era estruturalmente o mesmo.
Além disso, observe isso, se eu realmente ver este exemplo,
deixe-me ir para a versão One agora,
e perceber que eu tenho CS50 Palestra Syllabus.
Uh oh, CS50 Semana Zero Week Um e CS50 quarta-feira sexta-feira,
Eu meio que cortar um canto.
O que foi - o que eram esses títulos anteriormente?
[Comentário Off Mic]
Eles eram como palestras em Semana Zero, como se fosse tipo
de mais sexy, e ele realmente tinha algum dinamismo a ele,
e isso é uma espécie de - eu sou apenas uma espécie de punting agora
e apenas assumindo que todo o site é CS50
e ele funciona bem, mas é certamente não tão elegante
ou como uma espécie de reta encaminhar como era antes,
mas que faz sentido, porque se você olhar para php índice dot
e palestras dot php e na semana de zero php ponto,
eles são todos, incluindo o mesmo arquivo,
então como podemos melhorar isso?
Qual é a próxima iteração este código provavelmente vai fazer?
[Comentário Off Mic]
Sim, exatamente, por isso, se - e deixe-me resumir
com que essencialmente quer parametrizar esse cabeçalho
para que sim ainda há um tag h1 codificado, mas o material
no meio, a céu aberto ea marca de perto,
presumivelmente é dinâmica, e vindo de outra coisa.
Talvez o "get string" ou o coisa após o ponto de interrogação
na URL estavam em algum lugar outra coisa, então vamos dar uma olhada.
Então, se eu entrar na versão dois,
agora percebe que eu tenho tenho um arquivo adicional,
parece que ajudantes dot php.
Eu realmente não sei por onde começam então eu vou começar apenas
no índice como como sempre, e agora notar que é um pouco diferente,
então eu tenho uma linha requerem
na parte superior requerendo ajudantes dot php,
mas eu posso chamá-lo o que eu quiser,
mas agora percebe linha de três há uma chamada de função
para tornar cabeçalho, que é interessante na medida
como o que está sendo passado aparentemente, o título personalizado
Para que esta página particular.
Enquanto isso há renderizar rodapé na parte inferior,
e eu não preciso de qualquer parametrização não é apenas
um rodapé, mas agora parece
ser um passo em direção a uma melhor solução, render cabeçalho leva,
eo que fazer a praça parênteses indicam para aqueles
que não viram php nunca ou em quando?
[Comentário Off Mic]
Sim, é um array.
É uma matriz associativa ou um hash que associa chaves
com valores; é como Java Scripts, notação objeção,
ou em outros idiomas, syntaxs semelhantes.
Tudo bem, então o que é em ajudantes dot php?
Em ajudantes dot php é apenas um par de funções,
tornar cabeçalho e tornar rodapé.
Assim, um par de detalhes se menos familiar,
Então, primeiro de tudo, o fato
esse cabeçalho tornar leva um argumento de dados que, aparentemente,
atribuído o vazio disposição não significa o quê?
O que significa fazer iguais suporte aberto fechado suporte
como um parâmetro em php?
É o valor padrão.
Então, se eu não passar em ordem ou qualquer argumento que seja
para tornar o cabeçalho ou o render função rodapé,
Posso pelo menos a confiança como o autor dessas funções
que os dados serão minimamente ser um array vazio;
ele não vai ser indefinido ou falsa, ou algo parecido,
ele vai ser exatamente o que Eu dei-lhe como um padrão.
Agora isso é um pouco de uma espécie de uma maneira hackish de símbolos de carga
em seu espaço de nome por assim dizer,
mas funciona muito bem para este fim
de implementação de nossa própria espécie de mecanismo de modelagem do homem pobre.
Tudo bem, há uma grande quantidade de ferramentas para fora lá para Python Rubi
php e que lhe dão capacidades de templates
e isso é exatamente o que queremos.
Queremos um modelo que tem uma tag aberta h1, um h1 fechada tag,
e uma espécie de lugar titular no meio,
e nós queremos preencher aqueles lugar titulares por meio desta função,
assim que esta função extrair só acontece
para dar-lhe a seguinte capacidades.
Se você tem um associativa da matriz com pares de valores-chave
como foo é igual a bar, extrato vai criar uma variável local
chamado sinal efetivamente dólar foo e dar-lhe um valor de bar
por isso explode seu associativo matriz de pares de valores-chave
em novas variáveis ​​com os valores correspondentes.
E, então, exigir cabeçalho dot dot php é a mesma de antes,
então o que estamos, provavelmente, vai para ver dentro de php header ponto?
Ele provavelmente tem essa tag h1 ea marca de perto; o que está acontecendo
estar dentro dele provavelmente no meio dele?
[Comentário Off Mic]
Exatamente, há provavelmente alguns menção do título cifrão
e com certeza, se eu aumentar o zoom este não é o meu título de tag,
lá está a minha tag h1, e dentro do que é uma inserção dinâmica
do título de sinal de dólar, mas apenas para uma boa medida,
Estou fazendo isso html especial cobrar atrozmente nomeado
função, mas é útil; o que ele faz
ou o que é que se proteger contra?
Esta é realmente uma solução a uma ameaça que você está insinuando;
você teria nos levado a.
[Comentário Off Mic]
Exatamente, por isso, se um mal-intencionado usuário ou uma vítima inocente
de um ataque de phishing clicou em um link
que em auto tinha um ponto de interrogação e algo como foo iguais,
e, em seguida, o valor de de foo era realmente
como suporte aberto script, suporte fechado,
e, em seguida, algum código JavaScript;
se você não chamar esta principal função longa,
você realmente estar infectando html cru em sua página web,
o resultado de que é que você pode ser enganado.
Você pode estar enganando o usuário em execução de código JavaScript
que ele ou ela fez na verdade não pretendo.
E apesar de normalmente você só está prejudicando a si mesmo,
como só você sabe que um idiota vai digitar
no roteiro suporte aberto, suporte fechado, e dizer alerta
ou algo parecido e fazer ele ou ela mesma
com algum resultado estranho, se você não se enganou
a clicar em um link que tem JavaScript crua embutido nele
como o valor do atributo,
você pode, entre outras coisas roubar os cookies de alguém
porque não há uma propriedade chamado de cookie dot documento
em JavaScript que permite que você para pegar o cookie de sessão do usuário,
e se você se lembra o que é um sessão hijacking ataque é,
longa história curta, que é uma maneira de realmente enganar alguém
em dar-lhe que virtuais selo de mão e, em seguida, tomar
sobre a sua conta no Facebook ou algum outro tipo de conta.
Tudo bem, então esta é um pouco longo,
mas ele está apenas usando código html cru.
Isto é o equivalente de chamar de eco
ou imprimir de forma eficaz, e estamos inserindo essencialmente
que dinamicamente.
Então, o que mais permanece aqui?
Bem, deixe-me entrar Versão Três aqui,
e vamos ver um pouco diferente -
mesmo layout exato do arquivo mas aviso
que desta vez nós vamos generalizar o cabeçalho e rodapé
como modelos, de modo que que quero dizer com isso?
O que é a única coisa que é diferente aqui?
O que mudou desde a última versão?
Sutil, mas é, sem dúvida, apenas um projeto melhor mais limpo.
Sim?
[Comentário Off Mic]
Sim, há apenas uma função padrão prestar;
Eu não caso especial tornar cabeçalho ou rodapé tornar,
ambas as quais se A retirada ajudantes dot php,
estamos praticamente idêntico com exceção de seus nomes
e os modelos que eles incluídos.
Porque não basta parametrizar a função de tornar
e ter um argumento, que é o nome do modelo,
e um segundo argumento opcional que são os pares de valores-chave
que deseja plug in
Então, se eu agora olhar para ajudantes dot aviso php
que eu estou sendo um pouco mais sofisticado agora.
Na verdade, estou verificando é que a arquivo existe e se assim for, vá em frente
e exigirem; apenas no caso de o usuário acidentalmente tipos
em algum nome do modelo falso você Não quero lançar um erro
no programa para que possamos minimamente fazer-lhes esta
favorecer aqui.
Tudo bem, mas podemos levar isso um passo adiante?
Nesta versão aqui notar o seguinte.
Acabei de ls digitado, e o que imediatamente salta
a é um pouco diferente.
Portanto, há dois diretórios, direito,
e por isso este é agora um passo em direção o que acabará por ser a mais
estrutura adequada.
Este é tipo de desleixado de mim para estar jogando tudo
do meu conteúdo dentro de um diretório de acesso público
que literalmente é chamado pública.
E mesmo que, infelizmente, um monte de frameworks,
especialmente os mais antigos, e até mesmo algumas mensagens na web,
Sonho Anfitrião entre eles, as forças que você coloque todos os seus arquivos
o equivalente a um diretório público mesmo
se os seus arquivos pode incluir senhas de banco de dados
e nomes de usuário ou outros tais credenciais,
que não é de todo bom design.
Muito melhor é só colocar
no diretório público o que absolutamente não tem
ser acessível ao usuário, e tudo mais
que você está incluindo como ajudantes dot php,
não há nenhuma razão para que isso deve ser acessível através de um web
navegador com um url.
Pode ser completamente inócuo se o usuário quer ver talvez
que pares, mas é apenas do princípio de que,
e Deus me livre ele realmente faz ter um nome de usuário ou senha;
você não quer que a usuário acidentalmente
ou intencionalmente sendo capaz de acessá-lo.
Então, nós não estamos completamente em um abordagem perfeita aqui,
mas observe o seguinte agora.
Em php índice ponto, observe que Eu ainda estou exigindo ajudantes,
mas eu estou fazendo isso de tal forma que eu sou uma espécie de organizar tudo
dos arquivos que será incluído
em um subdiretório chamado convencionalmente inclui,
e, em seguida, eu chamo de processar para cabeçalho e rodapé como antes.
Então a única coisa Eu tenho feito é uma espécie
de reorganizar meus diretórios para ser um pouco mais anal
sobre a estrutura do arquivo.
Mas se vamos agora Neste quinto exemplo,
notar aqui que nós agora tem um trio de pastas,
e isto é um pouco enganosa no momento
porque pela simplicidade por uma questão de classe,
Acabei jogado tudo
em John Harvard Diretório Público apenas
para que possamos navegar ele via um navegador, mas aviso -
ignorar esta parte por apenas um momento,
o fato de que eu estou lá.
Repare que eu tenho três subdiretórios: público,
modelos, e inclui.
A ideia é agora que, em um devidamente configurado servidor web eu
diria que este Apache site tem acesso público
arquivos aqui, e em nenhum outro lugar.
Então, o arquivo que você acha Eu estou indo para ver o interior
de público, se eu digito ls?
O que há de pelo menos um arquivo isso é provavelmente aí?
[Comentário Off Mic]
Ok php índice ponto e o arquivo, obviamente, não é
lá, entre outros?
Como ajudantes dot php, header php ponto, rodapé dot php;
todos os fragmentos, toda a funcionalidade
que realmente não precisa para ser acessível ao público,
ele precisa ser utilizável por os ficheiros
que são acessíveis ao público, mas eles mesmos,
nenhum usuário precisa ver ou quire uma URL para ajudantes dot php.
Observe que, ao invés, se eu for
em inclui não há ajudantes dot php,
e se eu entrar em modelos,
há rodapé e header php ponto.
Francamente, eu poderia ter colocado los no mesmo diretório,
mas eu estou tentando ser ainda mais anal sobre como manter arquivos
que são apenas uma espécie de modelos estáticos diferente
a partir de arquivos funcionais como ajudantes dot php,
e eu só estou aderindo a alguns convenções bastante comuns
chamando os diretórios inclui e modelos.
Então a única coisa que alterada, então, é mais uma vez o caminho.
Se formos por aqui notar que agora eu só tenho
para incluir um diretório relativo,
dot dot barra inclui ajudantes dot php,
ou eu posso ser um pouco mais adequado e realmente fazer algo
assim, php e muito
de línguas têm esses símbolos especiais
que representam a diretório do arquivo atual,
assim sublinhado sublinhado dir sublinhado sublinhado representa
qualquer diretório é desse arquivo,
e por isso, se você acabou de concatenar com o operador do ponto, que,
que atingiriam o mesmo resultado,
e tende a ser um pouco mais robusto, porque você pode obter
em situações com relativa diretórios foram apenas dizendo dot
ou dot dot pode realmente trazê-lo para o lugar errado,
de modo que este tende a ser um pouco mais robusto.
Tudo bem, então o que embora restos?
O que você ainda não gosto sobre isso?
O que poderia ser melhorado e você comentou sobre isso antes, eu acho que
que ainda há algumas questões?
[Comentário Off Mic]
Certo, certamente não temos para começar a escrever como locais
que se parecem com isso, certo?
Este não se sente tudo isso muito melhor,
há ainda copiar e colar.
Eu ainda tenho o requer linha no topo.
Eu ainda tenho tornar cabeçalho tornar rodapé.
Há um monte de duplicação.
Sim?
[Comentário Off Mic]
Sim, exatamente, por isso temos tido um passo em direção a uma espécie de divisão
o "c" do "v", de modo MVC é Model View Controller;
controlador é uma espécie de cérebros da aplicação.
Modelo tende a ser a dados ou alguma funcionalidade partilhada
e tende a ser vista a estética, o modelo,
por isso demos um passo em direção a separando a "c" do "v"
porque agora, pelo menos, ter diretório deste modelo,
mas mesmo lá, essencialmente ter um controlador por arquivo.
Não parece que há muita lógica acontecendo aqui,
mas php índice ponto é efetivamente um controlador.
Quando você visita um URL e terminando no índice dot php,
toda a lógica de que implementa essa página está certo
em php índice ponto e mesmo para palestras dot php.
O mesmo para a semana de zero php ponto.
Então nós meio que Strone nossa lógica em todo o lugar,
e parece que isso não vai
a escala muito bem, uma vez que ter não quatro, mas quarenta páginas
se cada página começa com me copiando uma versão mais antiga
do arquivo e apenas aprimorando alguns
do conteúdo dentro dela.
Então, temos tido apenas um passo em direção a isso,
e uma das ferramentas vamos introduzir
na quarta-feira é um conspirador chamado "Laravel"
e isto é muito framework php popular,
Outros incluem "Fuelphp."
Há um mais velho chamado "CodeIgniter."
Há um chamado "bolo".
Há um chamado "Sinfonia".
Quero dizer, se você Google frameworks PHP,
há uma atroz número de frameworks como
que as pessoas que implementou.
Laravel é um dos mais para cima e chegados;
é uma das mais limpas queridos, e você encontrará
que em última análise, ajuda poupar um pouco
de tempo, mesmo que não haja um pouco de uma curva de aprendizado,
mas que irá guiá você mais na quarta-feira.
Além disso, vamos introduzir o que é chamado de "ORM".
Neste caso, vamos usar algo que vem
com este quadro chamado Laravel.
É chamado de "eloquente" e esta é apenas uma camada de código
que lhe permite, entre outras coisas falar com bancos de dados.
E, também aqui, deixe-me roubar um exemplo que seja recente
ou um retrocesso para alguns de vocês a partir de 50.
Se você demorou 50 anos, e você fez "CS50 Finanças,"
você pode recuperar arquivos que você escreve ou reescreveu que olhar
assim, este foi o login php ponto e no momento em que,
especialmente desde que não gastar muito tempo
em fundamentos php logo no início,
si isso pode ter sido bastante desafiador,
e foi o que fizemos, na verdade, tentar simplificar o design.
Nós realmente não separar "M" em "V" de "C" tanto assim
para os problemas que "Sete CS50 Finanças,"
de notar a única coisa que deve esperamos começar
em breve esfregar-lhe o errado aliás, é algo como isto.
Quero dizer, não só foi este login php ponto um controlador.
Ele também estava falando diretamente
para um banco de dados especificamente usando sequela, o qual não vai
para dimensionar muito bem quando você começa a trabalhar com uma
ou dois ou três parceiros.
Por exemplo, se um de dos parceiros é responsável
para criar o seu tabelas de banco de dados e que vem
com seus índices e descobrir
o que a chave deve ser, o chaves primárias, chaves estrangeiras,
e tudo isso, decidir sobre os nomes das tabelas e tudo isso.
Agora você a outra pessoa em o grupo precisa saber tudo
das decisões de projeto que ele ou ela tem feito, e agora você precisa
ao rígido código essas decisões em seu arquivo, então agora ele
ou ela é bonita muito restrito
para nunca mais mudar esses nomes de tabela.
Nunca mais para mudar esses nomes arquivados
sem informá-lo.
Além disso, você não pode realmente facilmente trabalhar no mesmo arquivo
sem colidir uns com os outros, se ele
ou ela é constantemente alteração de nomes,
e você tem a idade versões e assim por diante,
Portanto, esta é apenas convidando muitas e muitas dores de cabeça.
Além disso, como veremos ver em pouco tempo,
mesmo que você não precisa
fazer particularmente consultas sofisticados aqui,
uma vez que você começar a ter vários mesas, duas mesas, três, cinco,
dez mesas em um MySQL ou geralmente um banco de dados relacional,
você tem que juntar as tabelas muitas vezes se conhece, e você tem
para combinar dados de um com o outro,
e francamente suas consultas sequela começam a ficar mais tempo, e mais,
e mais, e mais complexa, e só começa
para ficar muito mais fácil cometer erros
e muito mais difícil de fazer as coisas direito.
E assim como ferramentas Eloqüente e ORM vai
para nos ajudar a modelar os nossos dados e também vai efetivamente
para gerar o código que nós precisa começar a consultar bancos de dados
em formas mais sofisticadas.
Então, se você tem uma chave primária aqui e uma chave estrangeira
aqui, tudo que você precisa a fazer é ensinar que ORM,
Objeto Relação Mapper, o que esse relacionamento é
e ele vai descobrir o que consultas para executar para você.
E só em raras casos que você precisa
escrever necessariamente código sequela si mesmo.
Se você realmente quer sintonizar algo bom,
mas a maior parte, você pode basta começar a tratar entidades
em seus bancos de dados como verdadeiros objetos e não estas linhas planas
que você precisa de alguma forma de reconstruir e de normalizar.