Primeiras aulas do curso MVC com PHP: Entenda o padrão Model-View-Controller

MVC com PHP: Entenda o padrão Model-View-Controller

Uma entrada para as requisições - Introdução

Olá! Meu nome é Vinicius Dias e serei seu instrutor nesse treinamento de PHP na Web. Depois de dois cursos de introdução ao PHP sem trabalharmos tanto com a Web, chegou a hora de aproveitarmos tudo que a linguagem pode oferecer nesse ambiente.

Nós entenderemos como funciona a arquitetura de uma aplicação, desde um servidor Web até a resposta em HTML e como gerenciar os nossos códigos trabalhando com boas práticas.

Como sou instrutor aqui na Alura e acabo me perdendo nos curso que já gravei, decidi criar, como exemplo do nosso treinamento, um gerenciador de cursos. Dessa forma, poderemos gerenciar quais cursos já foram gravados.

Para isso, implementaremos um sistema de login na aplicação, de modo que somente usuários cadastrados terão acesso a ela.

Após realizado o login com a senha correta, teremos acesso à lista de cursos, na qual poderemos cadastrar novos cursos e atualizar ou excluir os já existentes, sempre exibindo um feedback visual na página. Esse feedback será um conteúdo dinâmico, de modo que, se atualizarmos a página, a mensagem não será mais exibida.

Também aprenderemos como esses dados podem ser fornecidos para outro tipo de aplicação - por exemplo, buscando os cursos em XML para fornecer esses dados para clientes que não trabalharão com HTML, ou em JSON, um formato um pouco mais novo.

Tem bastante conteúdo interessante para estudarmos e discutirmos nesse curso. Bons estudos!

Uma entrada para as requisições - Ambiente e Projeto inicial

Para darmos início ao curso, precisamos configurar o nosso ambiente. Como iremos partir do princípio de que você já fez os cursos de PHP - Primeiros Passos com a Linguagem e PHP - Avançando com a Linguagem, você já deverá ter o PHP instalado.

Também partiremos do princípio de que você já fez o curso de Doctrine e conhece um pouco o Composer, um gerenciador de dependências - ou seja, um programa que gerencia alguns pacotes, bibliotecas ou componentes que usaremos ao longo do curso.

Caso você ainda não o tenha instalado e esteja utilizando o Windows, poderá baixar o instalador https://getcomposer.org/, executar o .exe e seguir as instruções na tela. No Linux ou no Mac, bastará executar os comandos disponíveis no site.

Com o PHP e o Composer instalados, você deverá baixar e extrair o ZIP contendo o projeto inicial.

Como nesse treinamento nós criaremos um gerenciador de cursos, podemos renomear a pasta onde o conteúdo foi extraído para "gerenciador-de-cursos", mas você pode escolher outro nome se preferir. Em seguida, abriremos o Prompt de Comando e navegaremos até essa pasta.

Feito isso, acessaremos o arquivo php.ini da pasta de configurações do PHP (onde você o instalou). No Linux, você pode encontrar essa pasta executando php -i no Terminal para printar todas as informações da sua instalação do PHP. Nesse ambiente, você poderá utilizar o comando php -i | grep "php.ini" para conseguir o caminho desse arquivo.

Abriremos o php.ini com o bloco de notas e, com "Ctrl + F", buscaremos por "sqlite". Em seguida, removeremos o ponto e vírgula da linha ;extension=pdo_sqlite para descomentá-la e salvaremos as alterações.

De volta ao terminal, executaremos composer install para instalarmos todas as dependências que precisaremos para o nosso projeto inicial, que por enquanto é só o Doctrine.

Enquanto as dependências são instaladas, podemos abrir um editor de texto e acessar a pasta "gerenciador-de-cursos" para trabalharmos no projeto. Durante o curso utilizaremos o PhpStorm, mas você pode optar pelo Eclipse ou qualquer outro editor.

De início, já temos uma pasta "public", que será a única acessível pela Web. Isso é uma medida de segurança que impede que algum usuário consiga ler o restante dos nossos arquivos por meio do servidor Web caso tenhamos algum problema de segurança, protegendo nosso dados de configuração e outras informações.

Dentro dela, temos um arquivo listar-cursos.php, que irá buscar os cursos no banco de dados e exibi-los na tela.

<?php
require __DIR__ . '/../vendor/autoload.php';

$entityManager = (new \Alura\Cursos\Infra\EntityManagerCreator())->getEntityManager();
$repositorioDeCursos = $entityManager->getRepository(\Alura\Cursos\Entity\Curso::class);
$cursos = $repositorioDeCursos->findAll();
?>
<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
</head>
<body>
<div class="container">
    <div class="jumbotron">
        <h1>Listar cursos</h1>
    </div>
    <ul class="list-group">
        <?php foreach ($cursos as $curso): ?>
            <li class="list-group-item">
                <?= $curso->getDescricao(); ?>
            </li>
        <?php endforeach; ?>
    </ul>
</div>
</body>
</html>

Nele, temos um código PHP que se inicia com um require para o arquivo autoload.php, um arquivo do Composer que nos permite acessar todas as classes sem precisarmos importar cada uma individualmente. Em seguida, temos um $entityManager provindo de um criador já pronto (idêntico ao que fizemos no curso de Doctrine), que utilizaremos para buscar o repositório de cursos.

Em "src/Entity", temos a classe Curso já mapeada. Essa classe possui apenas um $id e uma $descrição e seus respectivos getters e setters. Se o seu PhpStorm estiver indicando erros, basta pressionar "Alt + Enter" para informar que estamos utilizando a versão mais nova do PHP.

De volta ao listar.cursos.php, buscamos os $cursos com o findAll(). Em seguida, temos um código HTML com uma estrutura base, contendo um título "Listar cursos" e um foreach que exibe todos os cursos em uma lista.

Todo o nosso código fonte das classes PHP será armazenado na pasta "src". Em "Infra", temos o nosso EntityManagerCreator, no qual estamos utilizando o SQLite, e o nosso banco em SQLite (db.sqlite) se encontra na raiz do projeto.

Então, subiremos um servidor de teste com php -S localhost:8080 -t public. A definição -t public (onde t significa "target", ou seja, alvo) fará com que o ponto de entrada da aplicação será a pasta "public".

Feito isso, acessaremos http://localhost:8080/listar-cursos.php pelo navegador. Teremos então a nossa aplicação já inicializada para darmos continuidade aos nossos estudos do PHP na Web.

Uma entrada para as requisições - Formulário de inserção

Já temos a listagem de cursos implementada e funcionando, que foi entregue pronta, e agora começaremos a codar juntos. A primeira funcionalidade que podemos implementar é a criação de um novo curso ao gerenciador. Para isso, precisaremos adicionar um botão de "Novo curso" à nossa página.

Trabalhando no PhpStorm, digitaremos, abaixo de "Listar cursos", o seguinte código:

a.btn.btn-primary.mb-2

Quando escrevemos dessa forma, o PhpStorm entende que a se trata de uma tag HTML seguida de várias classes. Se pressionarmos "Tab" ao final, ele irá completar o esqueleto da tag - e como é o link, irá, inclusive, adicionar o href:

    <div class="jumbotron">
        <h1>Listar cursos</h1>
    </div>
    <a href="" class="btn btn-primary mb-2"></a>

Endereçaremos esse link para o arquivo formulario-novo-curso e adicionaremos o texto "Novo Curso" ao botão:

        <a href="formulario-novo-curso.php" class="btn btn-primary mb-2">
            Novo Curso
        </a>

Acessando a página, o botão estará lá. Clicando nele, teremos um erro "Not found", afinal ainda não temos esse arquivo. Dentro da pasta "public", criaremos um arquivo formulario-novo-curso.php. Nele, teremos basicamente toda a estrutura do listar-cursos.php, portanto copiaremos e colaremos esse código. Removeremos o trecho de código PHP, pois não precisaremos dele (pelo menos por enquanto), e também o botão de "Novo Curso">

<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
</head>
<body>
<div class="container">
    <div class="jumbotron">
        <h1>Novo Curso</h1>
    </div>

</div>
</body>
</html>

Teremos um formulário (<form>></form>) com uma <div> na qual teremos um <input> do tipo texto, recebendo descricao em id e name. Também teremos uma <label> para o campo descricao cujo texto será "Descrição". Nossa <div> terá a classe form-group e o <input> terá a classe <form-control>.

<form>
    <div class="form-group">
        <label for="descricao">Descrição</label>
        <input type="text" id="descricao" name="descricao" class="form-control">
    </div>
</form>

Dica: se tiver dúvidas sobre qual classe utilizar nas tags, não hesite em consultar a documentação do Bootstrap!

Adicionaremos também um botão de "Salvar". Assim, teremos:

<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
</head>
<body>
<div class="container">
    <div class="jumbotron">
        <h1>Novo Curso</h1>

    </div>

        <form>
            <div class="form-group">
                <label for="descricao">Descrição</label>
                <input type="text" id="descricao" name="descricao" class="form-control">
            </div>
            <button class="btn btn-primary">Salvar</button>
        </form>
</div>
</body>
</html>

Se acessarmos http://localhost:8080/formulario-novo-curso.php, teremos o nosso formulário já sendo exibido. Até o momento, nós copiamos o código do listar-cursos.php para o nosso formulario-novo-curso.php, já que temos uma estrutura repetida, removendo alguns trechos e adicionando um novo conteúdo.

No formulário que criamos, adicionamos um <input> com a <label> "Descrição" e um botão de "Salvar". Se prestarmos atenção, perceberemos que não só temos uma boa parte de código repetida em mais de um arquivo, como também temos código PHP misturado com HTML em um mesmo arquivo. Esses são alguns pontos que poderemos tratar.

Além disso, a URL com .php ao final não parece muito profissional. Seria interessante trabalharmos com URLs mais amigáveis, que inclusive ajudam no ranqueamento do Google. Também queremos controlar todas as requisições que chegam na nossa aplicação, por exemplo exibindo-as no terminal. Mas como faremos isso se cada URL a ser acessada na nossa aplicação é um arquivo diferente, sem um ponto de entrada único?

Conversaremos mais sobre esses assuntos no próximo vídeo.

Sobre o curso MVC com PHP: Entenda o padrão Model-View-Controller

O curso MVC com PHP: Entenda o padrão Model-View-Controller possui 282 minutos de vídeos, em um total de 91 atividades. Gostou? Conheça nossos outros cursos de PHP em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda PHP acessando integralmente esse e outros cursos, comece hoje!

  • 1150 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

Premium

  • 1150 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$75
à vista R$900
Matricule-se

Premium Plus

  • 1150 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$100
à vista R$1.200
Matricule-se

Max

  • 1150 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$120
à vista R$1.440
Matricule-se
Procurando planos para empresas?
Acesso por 1 ano
Estude 24h/dia onde e quando quiser
Novos cursos toda semana