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.