Concluído Pessoal PHP Bootstrap javascript

PHP Blog Content Management System

Blog pessoal, portfólio de projetos e currículo com PDF gerado automaticamente um CMS estilo WordPress construído do zero, sem framework e sem dependências, pra rodar em qualquer hospedagem compartilhada.

PHP Blog Content Management System

PHP 7.2+ MySQL 8.0 Docker ready Bootstrap 5 Zero Dependencies License: MIT


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, errors e partials.


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 .env sem 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.xml e 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_handler e register_shutdown_function), evitando tela branca em produção e exibindo detalhes apenas quando APP_DEBUG está 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.

Screenshots