paulorb.dev é um blog, portfólio e currículo pessoal desenvolvido em PHP puro, sem frameworks, aplicando o padrão MVC de forma manual: roteamento, autoloading, injeção de dependência simples, camada de acesso a dados e views são implementados do zero em app/Core, sem Laravel, Symfony ou qualquer outro framework de mercado. O objetivo do projeto foi ter controle total sobre cada camada da aplicação e rodar em hospedagem compartilhada de baixo custo, sem Composer e sem acesso SSH.
Arquitetura
A aplicação segue MVC com camadas adicionais de Repository entre os controllers e o banco de dados. Toda requisição passa por um único ponto de entrada (public/index.php), que carrega variáveis de ambiente, inicia a sessão, verifica se o sistema já foi instalado e despacha a URL para um roteador próprio baseado em expressões regulares (sem .htaccess reescrevendo para arquivos PHP individuais).
- Controllers — um por recurso, separados entre área pública (blog, projetos, currículo, páginas, sitemap, comentários) e área administrativa (posts, páginas, projetos, categorias, mídia, comentários, usuários, currículo, configurações, atualização de banco).
- Repositories — encapsulam as consultas SQL (PDO com prepared statements) para posts, páginas, projetos, categorias, tags, comentários, mídia, usuários e as seções do currículo (experiências, formação, cursos, certificações).
- Core — implementações próprias de roteador, autoloader PSR-4, autenticação de sessão, leitor/escritor de
.env, sistema de migrations, geração de PDF, integração com reCAPTCHA e páginas de erro customizadas. - Views — templates PHP simples, sem engine de template, organizados em
site,admin,install,errorsepartials.
Stack e requisitos técnicos
CamadaTecnologia BackendPHP 7.2 (compatibilidade obrigatória com a hospedagem de produção), sem Composer, sem frameworks, Banco de dados MySQL 8, acesso ao banco de dados via PDO com prepared statements, Front-end Bootstrap 5 e Font Awesome via CDN, Google Fonts (Inter, Source Serif 4, JetBrains Mono), CSS próprio (tema claro/escuro), Editor de conteúdoQuill (WYSIWYG) no admin, com upload de imagens e biblioteca de mídia, Geração de PDF via FPDF (vendorizada em lib/fpdf) para o currículo em PDF, Ambiente de desenvolvimento Docker (PHP-Apache + MySQL) via docker-composeisolado do .env de produção Deploy FTP para hospedagem compartilhada (sem SSH), sem pipeline de CI/CD
Funcionalidades principais
- Blog com posts, categorias, tags, busca, paginação e arquivo por mês/ano;
- Sistema de comentários com moderação (aprovar, marcar como spam, excluir) e proteção via Google reCaptcha;
- Seção de projetos com galeria de imagens por projeto e paginação.
- Páginas estáticas dinâmicas no estilo WordPress (rota "catch-all" resolvida por slug).
- Currículo estruturado (experiências, formação, cursos, certificações) editável no admin, com exportação do currículo em PDF;
- Biblioteca de mídia própria para upload, edição de metadados e reuso de imagens entre posts, projetos e currículo.
- Painel administrativo completo com autenticação de sessão, CRUD de usuários, categorias e configura.
- Sistema de migrations próprio, com um assistente de instalação (wizard) que verifica requisitos do cria o primeiro usuário administrador e grava o
.envsem acesso a terminal. - Painel de atualização de banco no próprio admin, que aplica migrations pendentes uma a uma;
- Geração automática de
sitemap.xmle páginas de erro (403/404/500) customizadas.
Segurança e boas práticas
- Todas as consultas usam PDO com prepared statements, evitando injeção de SQL;
- Autenticação de administrador baseada em sessão, com hash de senha e regeneração de ID de sessão;
- Rotas administrativas protegidas por verificação de sessão em cada controller;
- Formulário público de comentários protegido por reCAPTCHA e validação/escape de entrada;
- Tratamento centralizado de exceções e erros fatais (via
set_exception_handlereregister_shutdown_function), evitando tela branca em produção e exibindo detalhes apenas quandoAPP_DEBUGestá ativo; - Chave de instalação (
INSTALL_KEY) exigida para acessar o assistente de instalação, que fica bloqueado após a conclusão do setup;
Restrições e decisões técnicas
O maior desafio do projeto foi desenvolver com PHP 8.3 localmente mantendo compatibilidade estrita com propriedades tipadas, sem recursos exclusivos do PHP 8 (attributes, match, union types, nullsafe, arrowfunctions) e sem Composer. Essa restrição veio da hospedagem de produção, travada nessa versão, e da biblioteca PDF em vez de instalá-la via gerenciador de pacotes, e construir um roteador, autoloader e sistema de migrations próprios em vez de usar bibliotecas prontas. O deploy é feito manualmente via FTP.