PHP MVC Application
Esta é uma aplicação simples desenvolvida em PHP utilizando o padrão MVC (Model-View-Controller). O objetivo principal é gerenciar dados de usuários com foco em princípios de programação orientada a objetos e boas práticas de design de software. A aplicação implementa funcionalidades de CRUD (Criar, Ler, Atualizar, Excluir) para gerenciamento de usuários com a possibilidade de expandir com outros módulos, utilizando SQLite como banco de dados.
A aplicação agora utiliza uma classe Entidade (User) para representar os dados do usuário, melhorando o encapsulamento e a organização do código.
Estrutura do Projeto
php-mvc-app
??? app
?   ??? Controllers
?   ?   ??? UserController.php
?   ?   ??? ApiUserController.php
?   ??? Models
?   ?   ??? UserModel.php
?   ??? Entities
?   ?   ??? UserModel.php
?   ??? Views
?   ?   ??? templates
?   ?   ?   ??? partials
?   ?   ?   ?   ??? header.php
?   ?   ?   ?   ??? footer.php
?   ?   ?   ??? user
?   ?   ?   ?   ??? create.php
?   ?   ?   ?   ??? edit.php
?   ?   ?   ?   ??? index.php
?   ?   ?   ??? errors
?   ?   ?       ??? 404.php
?   ??? core
?       ??? BaseController.php
?       ??? Router.php
?       ??? View.php
?       ??? Flash.php
?       ??? Redirect.php
?   ??? Validators
?       ??? UserValidator.php
??? config
?   ??? database.php
??? public
?   ??? index.php
?   ??? routes.php
?   ??? assets
?       ??? css
?       ?   ??? style.css
?       ??? js
?       ?   ??? darkmode.js
?       ??? images
??? .env.example
??? composer.json
??? README.md
Funcionalidades
- 
Gerenciamento de Usuários: Criar, ler, atualizar e excluir registros de usuários.
- 
Suporte a API: Responder a requisições API com dados em formato JSON.
- 
Sistema de Rotas: Gerenciamento de URLs com suporte a parâmetros dinâmicos.
- 
Renderização de Views: Renderização dinâmica de templates com suporte a partials (cabeçalho e rodapé) e uma função helper (`$h`) para escaping de HTML.
- 
Mensagens Flash: Notificações para ações realizadas pelo usuário.
- 
Persistência de Formulários: Mantém os dados preenchidos em formulários (exceto senhas) após erros de validação, usando mensagens flash para "old input".
- 
Modo Escuro: Alternância entre temas claro e escuro com persistência via `localStorage`.
- 
Injeção de Dependências: Uso de classes auxiliares como `UserValidator` para validações específicas.
- 
Uso de Entidades: A classe `UserModel` retorna objetos `User` em vez de arrays, promovendo melhor encapsulamento.
Padrões de Design Utilizados
- 
Princípios SOLID:
- Responsabilidade Única (SRP): Cada classe tem uma única responsabilidade. Por exemplo, `UserValidator` é responsável apenas por validações de usuários.
- Inversão de Dependência (DIP): Controladores dependem de abstrações (como `UserValidator`) em vez de implementações concretas.
- (Outros princípios como OCP, LSP, ISP também são considerados no design geral).
- 
Composição sobre Herança:
- A lógica genérica é centralizada na `BaseController`, enquanto funcionalidades específicas são delegadas a classes auxiliares como `UserValidator`.
- 
Padrão Strategy:
- A validação de dados é encapsulada em uma classe separada (`UserValidator`), permitindo a reutilização e substituição de estratégias de validação.
- 
Padrão Dependency Injection:
- Classes como `UserValidator` são injetadas nos controladores, facilitando a substituição e os testes unitários.
- 
Padrão Template Method:
- A `BaseController` fornece métodos genéricos (`extractAndValidateData`, `jsonResponse`) que podem ser reutilizados ou estendidos por controladores específicos.
- 
Padrão Entity:
- A classe `App\Entities\User` representa um registro de usuário, encapsulando seus dados e getters.
Como Funcionam as Mensagens Flash e Redirecionamentos
Mensagens Flash
As mensagens flash são usadas para exibir notificações temporárias ao usuário, como mensagens de sucesso ou erro. Elas são armazenadas na sessão e removidas automaticamente após serem exibidas.
- Definir uma Mensagem Flash (Ex: Erro):
  use App\Core\Flash;
  // A chave da sessão é definida em .env (FLASH_MESSAGE_KEY)
  Flash::setMessage($_ENV['FLASH_MESSAGE_KEY'], ['error' => 'Senha inválida.']);
Redirecionamentos
A classe Redirect é usada para redirecionar o usuário para outra página, com suporte a mensagens flash.
- 
Redirecionar com Mensagem Flash e "Old Input" (após erro de validação):
use App\Core\Redirect;
// Passa a mensagem de erro e os dados do $_POST para repopular o formulário
Redirect::with('/user/create', ['error' => 'Dados inválidos.'], $_POST);
 
- 
Redirecionar com Mensagem Flash (após sucesso):
use App\Core\Redirect;
Redirect::with('/user/create', ['error' => 'Ocorreu um erro ao criar o usuário.']);
 
- 
Redirecionar sem Mensagem Flash:
Redirect::to('/user/index');
 
Validações com UserValidator
A classe UserValidator é responsável por validar os dados de entrada relacionados a usuários. Ela é injetada nos controladores para garantir que as validações sejam centralizadas e reutilizáveis.
Instalação
- 
Clone o repositório:
git clone https://github.com/faustinopsy/php-mvc-app
 
- 
Navegue até o diretório do projeto:
cd php-mvc-app
 
- 
Instale as dependências usando o Composer:
composer install
 
- 
Configure a conexão com o banco de dados no arquivo `config/database.php` e configure o banco SQLite.
- 
Crie um arquivo `.env` na raiz do projeto com as variáveis de ambiente necessárias. Use o arquivo `.env.example` como referência.
Uso
- 
Acesse o arquivo `public/index.php` no navegador para iniciar a aplicação.
- 
Utilize as rotas fornecidas para gerenciar usuários e interagir com a aplicação.
- 
Se o php estiver setado nas variáveis de ambiente basta iniciar o servidor embutido dentro da pasta do projeto:
php -S localhost:8080 -t public
Contribuindo
Sinta-se à vontade para enviar issues ou pull requests para melhorias e correções de bugs.
Licença
Este projeto é open-source e está disponível sob a licença MIT.