LP3

LP3

LP3

profile-pic

Arquitetura do Projeto Template

Esta página explica a organização do projeto projeto-template/. A ideia é enxergar o template como uma aplicação web em camadas: algumas pastas guardam telas, outras guardam regras de negócio, outras centralizam acesso ao banco e outras reaproveitam pedaços comuns da interface.

Ponto principal: a pasta pages/ contém as janelas da aplicação. Cada arquivo PHP nessa pasta representa uma tela ou uma ação acessada pelo navegador. As páginas não deveriam conter SQL solto; quando precisam do banco, chamam os repositories.

Use o menu lateral para navegar pelas partes da arquitetura.

Estrutura de diretórios

A árvore abaixo mostra a separação das responsabilidades no template. A organização não é apenas estética: ela ajuda a encontrar erros, reaproveitar código e impedir que as páginas virem arquivos enormes misturando HTML, regra de negócio e SQL.

projeto-template/ | |-- assets/ | `-- style.css visual da aplicação | |-- config/ | `-- database.php conexão PDO com o MySQL | |-- entity/ | |-- Pokemon.php objeto e regras de Pokémon | `-- Usuario.php objeto e regras de Usuário | |-- includes/ | |-- auth.php proteção de páginas internas | |-- footer.php rodapé comum | `-- header.php topo, menu e usuário logado | |-- pages/ | |-- index.php lista os pokémons do usuário | |-- login.php tela de autenticação | |-- logout.php encerra sessão e redireciona | |-- pokemon_create.php formulário de cadastro | |-- pokemon_delete.php confirma e executa exclusão | `-- pokemon_edit.php formulário de edição | |-- repository/ | |-- PokemonRepository.php SQL da tabela pokemon | `-- UsuarioRepository.php SQL da tabela usuario | `-- banco.sql criação e carga inicial do banco
Leitura importante

O navegador acessa arquivos em pages/. Esses arquivos carregam outros arquivos com require_once. Por isso, uma página como index.php pode usar auth.php, PokemonRepository.php, header.php e footer.php sem copiar o conteúdo deles.

Responsabilidade de cada pasta

Cada pasta tem um papel específico. Quando você criar o seu próprio projeto, a troca de tema não deve acontecer só no nome dos arquivos: a modelagem, as entidades, os repositories e as telas precisam fazer sentido para o novo domínio.

config/database.php
Config

Centraliza a configuração de conexão com o MySQL usando PDO. Se o nome do banco, usuário ou senha mudar, a alteração fica concentrada aqui.

includes/
Includes

Guarda pedaços reaproveitáveis. header.php e footer.php evitam repetição de layout. auth.php protege páginas internas.

entity/
Entity

Representa os objetos principais do sistema. No template, Usuario e Pokemon guardam dados e regras básicas de validação do próprio objeto.

repository/
Repository

Concentra o SQL. As páginas pedem ao repository para listar, buscar, salvar ou excluir. Isso separa a tela da persistência dos dados.

pages/
Pages

Contém as telas e ações acessadas pelo navegador. Cada arquivo recebe uma requisição, decide o que precisa acontecer e monta a resposta em HTML ou redirecionamento.

assets/style.css
Assets

Guarda os recursos estáticos do projeto. Neste template, há um CSS próprio que define o visual editorial da aplicação PokéCRUD.

banco.sql
Banco

Script de criação do banco: cria as tabelas usuario e pokemon, define chave estrangeira e insere dados iniciais para teste.

Pasta ou arquivo O que deve ficar ali O que evitar
pages/ Telas, leitura de GET/POST, chamadas para entidades e repositories. SQL espalhado diretamente no meio do HTML.
repository/ Consultas SQL, uso de PDO, conversão entre linhas do banco e objetos. HTML, menus, formulários ou lógica visual.
entity/ Atributos, getters, validações e métodos que mudam o estado do objeto. Conexão com banco ou comandos echo de interface.
includes/ Partes comuns reaproveitadas por várias páginas. Código específico de uma única tela.

Fluxo de uma requisição

Quando o usuário abre uma página, o navegador faz uma requisição HTTP. O PHP executa o arquivo, carrega dependências, consulta o banco se necessário e devolve HTML para o navegador.

1
Navegador pede uma página

Exemplo: o usuário acessa pages/index.php. Essa é a entrada da tela de listagem de pokémons.

2
Página carrega dependências

A página usa require_once para carregar autenticação e classes necessárias, como PokemonRepository.

3
Repository conversa com o banco

O repository usa database.php para obter a conexão PDO e executar consultas SQL com segurança.

4
Entity representa o resultado

As linhas retornadas do banco viram objetos, como instâncias de Pokemon. A página trabalha com objetos, não com SQL bruto.

5
Página renderiza HTML

A tela inclui header.php, imprime o conteúdo principal e finaliza com footer.php.

6
Navegador mostra a resposta

O aluno vê uma janela pronta: login, listagem, formulário, confirmação ou redirecionamento.

Exemplo de dependências em index.php
require_once __DIR__ . '/../includes/auth.php';
require_once __DIR__ . '/../repository/PokemonRepository.php';

$repo = new PokemonRepository();
$pokemons = $repo->listarPorUsuario($_SESSION['usuario_id']);

require_once __DIR__ . '/../includes/header.php';

As páginas como janelas da aplicação

A pasta pages/ é a parte mais visível para o usuário. Pense nela como um conjunto de janelas: cada arquivo abre uma tela ou executa uma ação específica da aplicação.

login.php

Janela pública de autenticação. Recebe email e senha por POST, compara o hash da senha e cria a sessão do usuário.

index.php

Janela principal depois do login. Lista apenas os pokémons do usuário logado e oferece links para pokemon_create.php, pokemon_edit.php e pokemon_delete.php.

Meus Pokémons + Novo Pokémon Ash Ketchum Sair
Meus Pokémons
+ Novo Pokémon
# Nome Tipo Nível Ações
1 Pikachu Elétrico Lv. 35
Editar Excluir
2 Charmander Fogo Lv. 20
Editar Excluir
pokemon_create.php

Janela de cadastro. Começa com campos vazios, recebe os dados por POST, cria um objeto com Pokemon::novo() e salva pelo repository.

Meus Pokémons + Novo Pokémon Ash Ketchum Sair
Novo Pokémon
Voltar
Squirtle
Água
18
Cadastrar Pokémon Cancelar
pokemon_edit.php

Janela de edição. Exige ?id=, busca o pokémon no banco, confirma se ele pertence ao usuário logado e só então permite alterar os dados.

Meus Pokémons + Novo Pokémon Ash Ketchum Sair
Editar Pokémon
Voltar
Pikachu
Elétrico
36
Salvar alterações Cancelar
pokemon_delete.php

Janela de confirmação. Primeiro mostra o item que será excluído; só remove do banco depois de receber POST.

Meus Pokémons + Novo Pokémon Ash Ketchum Sair
Excluir Pokémon
Voltar
Você tem certeza?

Você está prestes a excluir o pokémon Pikachu (Elétrico, Lv. 35). Esta ação não pode ser desfeita.

Sim, excluir Cancelar
logout.php

Não é uma janela visual completa. É uma ação: destrói a sessão e redireciona o usuário de volta para login.php.

Logout

session_destroy();

Redireciona para:
login.php

Resumo mental: login.php entra, index.php lista, pokemon_create.php cria, pokemon_edit.php edita, pokemon_delete.php confirma a exclusão e logout.php sai.

Modelo ER do banco

O banco do template é pequeno de propósito. Ele tem duas tabelas: usuario e pokemon. Um usuário pode ter vários pokémons, mas cada pokémon pertence a um único usuário.

usuario
  • PK idINT
  • nomeVARCHAR(100)
  • email UNIQUEVARCHAR(150)
  • senhaCHAR(64)
  • criado_emDATETIME
1
N
usuario.id
referencia
pokemon.usuario_id
pokemon
  • PK idINT
  • nomeVARCHAR(100)
  • tipoVARCHAR(50)
  • nivelINT
  • FK usuario_idINT
Trecho essencial do banco.sql
CREATE TABLE IF NOT EXISTS usuario (
    id        INT          NOT NULL AUTO_INCREMENT,
    nome      VARCHAR(100) NOT NULL,
    email     VARCHAR(150) NOT NULL,
    senha     CHAR(64)     NOT NULL,
    criado_em DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    UNIQUE KEY uq_email (email)
);

CREATE TABLE IF NOT EXISTS pokemon (
    id         INT          NOT NULL AUTO_INCREMENT,
    nome       VARCHAR(100) NOT NULL,
    tipo       VARCHAR(50)  NOT NULL,
    nivel      INT          NOT NULL DEFAULT 1,
    usuario_id INT          NOT NULL,
    PRIMARY KEY (id),
    CONSTRAINT fk_pokemon_usuario
        FOREIGN KEY (usuario_id) REFERENCES usuario(id)
        ON DELETE CASCADE
);
Como ler o relacionamento

A chave estrangeira pokemon.usuario_id aponta para usuario.id. Isso permite perguntas como: "quais pokémons pertencem ao usuário logado?". É por isso que a listagem chama um método como listarPorUsuario($_SESSION['usuario_id']).

Roteiro para estudar o template

Para entender o projeto sem se perder, leia os arquivos nesta ordem. Ela acompanha o caminho natural de uma aplicação: banco, conexão, autenticação, tela, repository e entidade.

Ordem sugerida
  1. Leia banco.sql e identifique tabelas, chaves primárias e chave estrangeira.
  2. Abra config/database.php e veja como o PDO se conecta ao MySQL.
  3. Abra pages/login.php e acompanhe como a sessão é criada.
  4. Abra includes/auth.php e entenda como páginas internas são bloqueadas.
  5. Abra pages/index.php e veja a tela chamando PokemonRepository.
  6. Abra repository/PokemonRepository.php e localize os métodos de listar, buscar, salvar e excluir.
  7. Abra entity/Pokemon.php e observe onde ficam as validações do objeto.
  8. Compare pokemon_create.php, pokemon_edit.php e pokemon_delete.php: uma tela cadastra, outra altera dados existentes e outra confirma remoção.

Para o Trabalho 02: substituir Pokémon por outro tema exige trocar a entidade, o repository, as páginas, o SQL e as regras de negócio. Se só trocar nomes mantendo a mesma estrutura sem novas decisões de domínio, o projeto continuará sendo essencialmente o template.