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.
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.
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.
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.
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.
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.
Guarda pedaços reaproveitáveis. header.php e footer.php
evitam repetição de layout. auth.php protege páginas internas.
Representa os objetos principais do sistema. No template, Usuario e
Pokemon guardam dados e regras básicas de validação do próprio objeto.
Concentra o SQL. As páginas pedem ao repository para listar, buscar, salvar ou excluir. Isso separa a tela da persistência dos dados.
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.
Guarda os recursos estáticos do projeto. Neste template, há um CSS próprio que define o visual editorial da aplicação PokéCRUD.
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. |
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.
Exemplo: o usuário acessa pages/index.php. Essa é a entrada da tela de
listagem de pokémons.
A página usa require_once para carregar autenticação e classes necessárias,
como PokemonRepository.
O repository usa database.php para obter a conexão PDO e executar consultas
SQL com segurança.
As linhas retornadas do banco viram objetos, como instâncias de Pokemon.
A página trabalha com objetos, não com SQL bruto.
A tela inclui header.php, imprime o conteúdo principal e finaliza com
footer.php.
O aluno vê uma janela pronta: login, listagem, formulário, confirmação ou redirecionamento.
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';
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.phpJanela 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.
| # | 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.
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.
pokemon_delete.phpJanela de confirmação. Primeiro mostra o item que será excluído; só remove do banco depois de receber POST.
Você está prestes a excluir o pokémon Pikachu (Elétrico, Lv. 35). Esta ação não pode ser desfeita.
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.
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.
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.idpokemon.usuario_id
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
);
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']).
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.
banco.sql e identifique tabelas, chaves primárias e chave estrangeira.config/database.php e veja como o PDO se conecta ao MySQL.pages/login.php e acompanhe como a sessão é criada.includes/auth.php e entenda como páginas internas são bloqueadas.pages/index.php e veja a tela chamando PokemonRepository.repository/PokemonRepository.php e localize os métodos de listar, buscar, salvar e excluir.entity/Pokemon.php e observe onde ficam as validações do objeto.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.