API REST desenvolvida em PHP seguindo boas práticas, arquitetura limpa e padrões de projeto.
API Pyzitech é uma API REST completa para gerenciamento de usuários, construída com PHP 8+ utilizando princípios de Clean Architecture, DDD (Domain-Driven Design) e padrões de projeto como Repository Pattern, Service Layer e Dependency Injection.
git clone https://github.com/adimael/api-pyzitech.git
cd api-pyzitechcomposer installCrie um arquivo .env na raiz do projeto copiando o exemplo:
cp .env.example .envConfigure as variáveis necessárias no arquivo .env:
# Configuração da aplicação
APP_NAME=API Pyzitech
APP_VERSION=1.0.0
APP_ENV=development
APP_DEBUG=true
APP_PORT=8000
APP_URL=http://localhost:8000
APP_TIMEZONE=America/Bahia
# Configuração do banco de dados (PostgreSQL)
DB_CONEXAO=postgresql
DB_HOST=localhost
DB_PORT=5432
DB_NOME=pyzitech_api
DB_USUARIO=seu_usuario
DB_SENHA=sua_senha
# Configuração do JWT
JWT_SECRET=sua_chave_secreta_jwt_aqui
JWT_ISSUER=http://localhost:8000
JWT_AUDIENCE=http://localhost:8000
JWT_EXPIRATION_TIME=3600
# Outras configurações...php -S localhost:8000 -t .# Compose ou comando docker runAcesse: http://localhost:8000
src/
├── Configs/ # Configurações da aplicação
│ └── EnvConfig.php
├── Database/ # Camada de acesso a dados
│ ├── Exceptions/ # Exceções específicas do banco
│ ├── Mysql/ # Conexão MySQL (não utilizado)
│ └── PostgreSQL/ # Conexão PostgreSQL
│ └── Conexao.php
├── Domain/ # Camada de domínio (DDD)
│ ├── Entities/ # Entidades de domínio
│ │ └── Usuario.php
│ └── Exceptions/ # Exceções de domínio
├── Exceptions/ # Exceções da aplicação
├── Http/ # Camada HTTP
│ ├── Controllers/ # Controladores
│ ├── Middlewares/ # Middlewares
│ ├── Request/ # Objeto Request
│ └── Response/ # Objeto Response
├── Repositories/ # Repositórios (Repository Pattern)
├── Routes/ # Sistema de rotas
├── Services/ # Camada de serviço (Service Layer)
└── Utils/ # Utilitários
src\Routes\Router- Roteador principal da aplicaçãosrc\Routes\Route- Classe auxiliar para definição de rotassrc\Http\Request\Request- Representa uma requisição HTTPsrc\Http\Response\Response- Representa uma resposta HTTPsrc\Http\Controllers\UsuarioController- Controlador de usuáriossrc\Http\Middlewares\AuthMiddleware- Middleware de autenticaçãosrc\Services\AuthService- Serviço de autenticação JWTsrc\Domain\Entities\Usuario- Entidade de domínio Usuáriosrc\Repositories\UsuarioRepository- Repositório de usuáriossrc\Database\PostgreSQL\Conexao- Conexão com PostgreSQL
| Método | Endpoint | Descrição |
|---|---|---|
GET |
/ |
Status da aplicação |
| Método | Endpoint | Descrição |
|---|---|---|
GET |
/api/usuarios |
Lista usuários (paginado) |
GET |
/api/usuario/{uuid} |
Busca usuário por UUID |
POST |
/api/criar/usuario |
Cria novo usuário |
PUT |
/api/usuario/{uuid} |
Atualiza usuário |
DELETE |
/api/usuario/{uuid} |
Deleta usuário |
PATCH |
/api/usuario/{uuid}/desativar |
Desativa usuário |
PATCH |
/api/usuario/{uuid}/ativar |
Ativa usuário |
Authorization: Bearer {seu_token_jwt}
Ou para acesso de super admin:
Authorization: Bearer {JWT_SECRET_do_.env}
curl -X POST http://localhost:8000/api/criar/usuario \
-H "Content-Type: application/json" \
-H "Authorization: Bearer seu_token_jwt" \
-d '{
"nome_completo": "João Silva",
"username": "joaosilva",
"email": "joao@email.com",
"senha": "Senha@123",
"url_avatar": "https://exemplo.com/avatar.jpg",
"biografia": "Desenvolvedor PHP"
}'curl -X GET "http://localhost:8000/api/usuarios?page=1&per_page=10" \
-H "Authorization: Bearer seu_token_jwt"curl -X PUT http://localhost:8000/api/usuario/{uuid} \
-H "Content-Type: application/json" \
-H "Authorization: Bearer seu_token_jwt" \
-d '{
"nome_completo": "João Silva Atualizado",
"biografia": "Desenvolvedor Senior PHP"
}'Crie um novo controller em src/Http/Controllers/:
<?php
namespace src\Http\Controllers;
use src\Http\Response\Response;
class MeuController
{
public function meuMetodo($request): Response
{
// Lógica do endpoint
return Response::json([
'message' => 'Endpoint funcionando!'
]);
}
}Adicione a rota em src/Routes/web.php:
// Para endpoint público
Route::get('/api/meu-endpoint', [MeuController::class, 'meuMetodo']);
// Para endpoint privado (requer autenticação)
Route::get('/api/meu-endpoint', [MeuController::class, 'meuMetodo'], AuthMiddleware::class);// GET - Recuperar dados
Route::get('/api/recurso', [Controller::class, 'metodo']);
// POST - Criar recurso
Route::post('/api/recurso', [Controller::class, 'metodo']);
// PUT - Atualizar recurso inteiro
Route::put('/api/recurso/{id}', [Controller::class, 'metodo']);
// DELETE - Remover recurso
Route::delete('/api/recurso/{id}', [Controller::class, 'metodo']);
// PATCH - Atualização parcial
Route::patch('/api/recurso/{id}', [Controller::class, 'metodo']);// Em src/Routes/web.php
Route::get('/api/publico', [MeuController::class, 'metodoPublico']);// Em src/Routes/web.php
Route::get('/api/privado', [MeuController::class, 'metodoPrivado'], AuthMiddleware::class);- Público: Qualquer pessoa pode acessar sem token
- Privado: Requer header
Authorization: Bearer {token}
O sistema utiliza JWT (JSON Web Tokens) para autenticação:
Header.Payload.Signature
Para acesso de super admin, utilize o valor de JWT_SECRET do .env como token:
Authorization: Bearer {valor_de_JWT_SECRET}
O middleware AuthMiddleware verifica:
- Presença do token
- Validade da assinatura
- Expiração do token
- Existência do usuário
- Suporte a PostgreSQL (principal) e MySQL
- Conexão gerenciada via Singleton
- Tratamento de exceções específico por tipo de erro
Configurável via APP_TIMEZONE no .env
Ative/desative modo debug com APP_DEBUG=true/false
Para executar testes (quando disponíveis):
# Comandos para testes futurosvlucas/phpdotenv:^5.6- Gerenciamento de variáveis de ambienteramsey/uuid:^4.9- Geração de UUIDs
- Fork o projeto
- Crie sua feature branch (
git checkout -b feature/AmazingFeature) - Commit suas mudanças (
git commit -m 'Add some AmazingFeature') - Push para a branch (
git push origin feature/AmazingFeature) - Abra um Pull Request
Este projeto está sob a licença MIT - veja o arquivo LICENSE para detalhes.
Adimael - adimaelbr@gmail.com
Para suporte, envie um email para adimaelbr@gmail.com ou abra uma issue no GitHub.