felipe-code / mvc-base
A simple PHP MVC skeleton for learning and reuse.
Requires
- php: >=8.5.0
- firebase/php-jwt: ^7.0
- lcobucci/jwt: ^5.6
- phpmailer/phpmailer: ^7.0
- predis/predis: ^3.4
- symfony/mercure: ^0.7.2
- vlucas/phpdotenv: ^5.6
- dev-main
- 4.4.6
- 4.4.5
- 4.4.4
- 4.4.3
- 4.4.2
- 4.4.1
- 4.4.0
- 4.3.4
- 4.3.3
- 4.3.2
- 4.3.1
- 4.3.0
- 4.2.6
- 4.2.5
- 4.2.4
- 4.2.3
- 4.2.2
- 4.2.1
- 4.2.0
- 4.1.0
- 4.0.3
- 4.0.2
- 4.0.1
- 4.0.0
- 3.5.1
- 3.5.0
- 3.4.3
- 3.4.2
- 3.4.1
- 3.4.0
- 3.3.5
- 3.3.4
- 3.3.3
- 3.3.2
- 3.3.1
- 3.3.0
- 3.2.1
- 3.2.0
- 3.1.1
- 3.1.0
- 3.0.0
- 2.6.0
- 2.5.3
- 2.5.2
- 2.5.1
- 2.5.0
- 2.4.3
- 2.4.2
- 2.4.1
- 2.4.0
- 2.3.1
- 2.3.0
- 2.2.0
- v2.1.0
- v2.0.1
- v2.0.0
- v1.0.2
- v1.0.1
- v1.0.0
This package is auto-updated.
Last update: 2026-04-10 04:34:10 UTC
README
Micro-framework PHP puro, construído do zero, focado em performance, segurança e arquitetura moderna. Ideal para aprender como um framework funciona por dentro ou como base para aplicações reais.
Por que este framework?
A maioria dos tutoriais de PHP ensina a usar o Laravel e esconde toda a mágica por baixo. Este projeto foi construído para revelar essa mágica — cada classe representa um conceito real de arquitetura:
- O
Routerimplementa pattern matching com regex e pipeline de middlewares - O
Containerfaz autowiring via PHP Reflection API (como o Laravel) - O
Modelimplementa o padrão Active Record com Eager Loading N+1-safe - O
Kernelsegue o padrão PSR-15 de pipeline de requisição
Features Principais
| Categoria | Feature |
|---|---|
| HTTP | Ciclo Request → Middleware Pipeline → Response (PSR-15 feeling) |
| Roteamento | Parâmetros dinâmicos, grupos, rotas nomeadas, PHP 8 Attributes (#[Get], #[Post]) |
| ORM | Active Record, QueryBuilder fluente, Eager Loading, Soft Deletes, Transações |
| Segurança | CSRF nativo, headers de segurança, Mass Assignment guard, hash de senha |
| Sessão | Drivers File/Redis, flash messages, regeneração de ID pós-login |
| Auth | JWT para APIs stateless, suporte a scaffold com php forge setup:auth |
| Validação | PHP 8 Attributes (#[Required], #[Email], etc) nos DTOs, Mutators |
| Views | Motor PHP com layouts, sections e suporte a HTMX com isHtmx() |
| Filas | Jobs assíncronos com drivers Database e Redis |
| Cache | Drivers File e Redis com TTL |
| PHPMailer com SMTP configurável | |
| Real-Time | Mercure Hub integrado + helper broadcast() + mercure_listen() |
| CLI (Forge) | Scaffolding, migrações, processamento de filas |
| Docker | FrankenPHP + Mercure + Redis + MariaDB pré-configurados |
| Debug | Error handler visual com stack trace, diagnóstico de banco de dados |
Instalação
Método 1: Via Composer (Recomendado)
composer create-project felipe-code/mvc-base nome-do-seu-projeto
O instalador interativo irá configurar o .env e preparar o projeto automaticamente.
Método 2: Via Git Clone
git clone https://github.com/FelipeOropeza/mvc-estrutura.git meu-app
cd meu-app
composer install
composer run post-create-project-cmd
Método 3: Via Docker (FrankenPHP + Mercure)
docker-compose up -d --build
Acesse http://localhost:8000. O FrankenPHP roda em Worker Mode para máxima performance (milissegundos por requisição).
Início Rápido (Servidor Local)
# Inicia o servidor embutido do PHP apontando para /public
composer start
Acesse http://localhost:8000.
CLI — Forge
A ferramenta de linha de comando para scaffolding e manutenção:
# Criação de código php forge make:controller NomeController php forge make:controller Api/UserController --api php forge make:model ProdutoModel php forge make:view secao/minha-view php forge make:component meu-componente php forge make:migration CreateProdutosTable php forge make:middleware VerificarAcessoMiddleware php forge make:rule CpfValido php forge make:mutator LimpaCpf # Banco de dados php forge migrate php forge migrate:rollback php forge migrate:fresh # Scaffolding de sistemas completos php forge setup:auth # Sistema de autenticação completo php forge setup:api # Scaffold de API JWT php forge setup:aviso # Demo de avisos em tempo real (Mercure) # Processamento de filas php forge queue:work # Otimização de produção php forge optimize # Cache de rotas para performance máxima php forge optimize:clear # Limpa o cache de rotas
Estrutura de Diretórios
.
├── app/
│ ├── Controllers/ # Lógica HTTP
│ ├── Models/ # Active Record (estende Core\Database\Model)
│ ├── Middleware/ # Middlewares da aplicação
│ └── Providers/ # Service Providers
├── bootstrap/ # Inicialização do framework
├── config/ # Configurações (app, database, middleware, mail...)
├── core/ # O framework em si
│ ├── Auth/ # TokenManager (JWT)
│ ├── Cache/ # Drivers de cache (File, Redis)
│ ├── Database/ # Connection (PDO), Model, QueryBuilder
│ ├── Exceptions/ # Handler, HttpException, ValidationException
│ ├── Http/ # Request, Response, Kernel, Pipeline, Session
│ ├── Mail/ # MailManager, PHPMailer driver
│ ├── Queue/ # QueueManager, Job
│ ├── Routing/ # Router, AttributeRouteScanner, RouteCompiler
│ ├── Support/ # Container (IoC), Logger, helpers.php
│ ├── Validation/ # Validator, DataTransferObject
│ └── View/ # PhpEngine, EngineInterface
├── database/
│ └── migrations/ # Arquivos de migração
├── docs/ # Documentação completa
├── public/ # Document root (index.php, assets)
├── resources/views/ # Templates PHP
├── routes/ # web.php, api.php
├── storage/ # Logs, cache, sessões, uploads
├── forge # CLI entry point (Linux/Mac)
└── forge.bat # CLI entry point (Windows)
Exemplo Rápido
Rota + Controller + Model em 3 arquivos:
// routes/web.php Route::get('/produtos', [ProdutoController::class, 'index'])->name('produtos.index'); Route::post('/produtos', [ProdutoController::class, 'store']);
// app/Controllers/ProdutoController.php class ProdutoController extends Controller { public function index(): Response { $produtos = (new Produto())->orderBy('nome')->get(); return view('produtos/index', compact('produtos')); } public function store(): Response { $data = validate(new ProdutoDto()); (new Produto())->insert($data); return redirect(route('produtos.index')); } }
// app/Models/Produto.php class Produto extends Model { protected array $fillable = ['nome', 'preco', 'categoria_id']; protected array $hidden = ['custo_interno']; public function categoria(): ?Categoria { return $this->belongsTo(Categoria::class, 'categoria_id'); } }
Documentação Completa
Consulte a pasta docs/ para guias detalhados:
| # | Guia |
|---|---|
| 02 | Estrutura de Diretórios |
| 03 | Roteamento Avançado |
| 04 | Controllers e Services |
| 05 | Banco de Dados e ORM |
| 06 | Validações e DTOs |
| 07 | Mutations |
| 08 | Middlewares e Segurança |
| 09 | Upload de Arquivos |
| 10 | Views e UI |
| 11 | Injeção de Dependências |
| 12 | CLI e Migrations |
| 13 | Helpers Globais |
| 14 | Redis e Sessões |
| 15 | Exceções e Debug |
| 16 | Nuvem e FrankenPHP |
| 17 | JWT e API |
| 18 | E-mails |
| 19 | Filas e Jobs |
| 20 | Cache |
| 21 | Eventos em Tempo Real (Mercure) |
| 22 | Tutorial CRUD Completo |
| 23 | Broadcasting Real-Time |
Exemplos em Destaque
- Avisos em Tempo Real — Notificações instantâneas com HTMX e Mercure em menos de 5 minutos.
Requisitos
- PHP 8.1+ (recomendado 8.3+)
- Extensões:
pdo,pdo_mysql(oupdo_pgsql/pdo_sqlite),mbstring,openssl - Composer 2.x
Licença
MIT — Feito com propósito educacional e uso em produção.