Skip to content

Commit 7b9c14a

Browse files
CAFernandesclaude
andcommitted
fix: Corrige compatibilidade com Express PHP e padrões de código
- Atualiza implementação do CycleMiddleware para usar setAttribute corretamente - Corrige tipos e anotações para PHPStan nível 9 - Aplica padrões PSR-12 em todo o código - Remove padrões ignorados desnecessários do PHPStan - Melhora formatação e organização do código - Adiciona documentação complementar Todos os testes estão passando: - PHPUnit: 68 testes OK - PHPStan: Nível 9 sem erros - PSR-12: 100% compatível 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent c076a10 commit 7b9c14a

31 files changed

Lines changed: 2586 additions & 529 deletions

README.md

Lines changed: 189 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,22 @@ composer require cafernandes/express-php-cycle-orm-extension
3232
// bootstrap/app.php
3333
use CAFernandes\ExpressPHP\CycleORM\CycleServiceProvider;
3434

35+
// Configure as variáveis de ambiente antes do registro
36+
$_ENV['DB_CONNECTION'] = 'sqlite';
37+
$_ENV['DB_DATABASE'] = __DIR__ . '/database/database.sqlite';
38+
39+
// Registre o provider
3540
$app->register(new CycleServiceProvider($app));
3641
```
3742

3843
### 2. Configurar Variáveis de Ambiente
3944

4045
```env
46+
# SQLite (desenvolvimento)
47+
DB_CONNECTION=sqlite
48+
DB_DATABASE=/path/to/database.sqlite
49+
50+
# MySQL (produção)
4151
DB_CONNECTION=mysql
4252
DB_HOST=localhost
4353
DB_PORT=3306
@@ -46,35 +56,86 @@ DB_USERNAME=your_username
4656
DB_PASSWORD=your_password
4757
```
4858

49-
### 3. Usar no Controller
59+
### 3. Uso Básico - Acesso Direto ao Database
60+
61+
```php
62+
// Acesso direto para queries simples
63+
$app->get('/api/users', function ($req, $res) use ($app) {
64+
$database = $app->make('cycle.database');
65+
$users = $database->database()->query('SELECT * FROM users')->fetchAll();
66+
67+
return $res->json(['data' => $users]);
68+
});
69+
70+
// Inserção com query builder
71+
$app->post('/api/users', function ($req, $res) use ($app) {
72+
$database = $app->make('cycle.database');
73+
$data = $req->getParsedBody();
74+
75+
$database->database()->insert('users')->values([
76+
'name' => $data['name'],
77+
'email' => $data['email'],
78+
'created_at' => date('Y-m-d H:i:s')
79+
])->run();
80+
81+
return $res->json(['message' => 'User created']);
82+
});
83+
```
84+
85+
### 4. Uso Avançado - Arquitetura Limpa com Repositórios
5086

5187
```php
5288
use CAFernandes\ExpressPHP\CycleORM\Http\CycleRequest;
5389

54-
class UserController
90+
// Repository Interface
91+
interface UserRepositoryInterface
92+
{
93+
public function findById(int $id): ?User;
94+
public function findAll(): array;
95+
public function save(User $user): void;
96+
}
97+
98+
// Repository Implementation
99+
class UserRepository implements UserRepositoryInterface
55100
{
56-
public function index(CycleRequest $request): JsonResponse
101+
public function __construct(
102+
private DatabaseInterface $database
103+
) {}
104+
105+
public function findById(int $id): ?User
57106
{
58-
// Buscar usuários com paginação automática
59-
$users = $request->paginate(
60-
$request->repository(User::class)->select(),
61-
page: 1,
62-
perPage: 10
63-
);
107+
$result = $this->database->query(
108+
'SELECT * FROM users WHERE id = ?',
109+
[$id]
110+
)->fetch();
64111

65-
return response()->json($users);
112+
return $result ? $this->mapToEntity($result) : null;
113+
}
114+
115+
private function mapToEntity(array $data): User
116+
{
117+
return new User(
118+
id: $data['id'],
119+
name: $data['name'],
120+
email: $data['email']
121+
);
66122
}
123+
}
124+
125+
// Controller com Injeção de Dependência
126+
class UserController
127+
{
128+
public function __construct(
129+
private UserRepositoryInterface $repository
130+
) {}
67131

68-
public function store(CycleRequest $request): JsonResponse
132+
public function show(int $id): JsonResponse
69133
{
70-
// Criar entidade a partir dos dados da request
71-
$user = $request->entity(User::class, [
72-
'name' => $request->input('name'),
73-
'email' => $request->input('email')
74-
]);
134+
$user = $this->repository->findById($id);
75135

76-
$request->em->persist($user);
77-
$request->em->run();
136+
if (!$user) {
137+
return response()->json(['error' => 'User not found'], 404);
138+
}
78139

79140
return response()->json($user);
80141
}
@@ -103,6 +164,49 @@ vendor/bin/phpunit --group integration
103164

104165
## 🔧 Funcionalidades Avançadas
105166

167+
### Sincronização de Schema
168+
```bash
169+
# Sincronizar schema do banco de dados
170+
php bin/console cycle:schema:sync
171+
172+
# Verificar status das migrações
173+
php bin/console cycle:status
174+
```
175+
176+
### Configuração Completa do Cycle ORM
177+
```php
178+
// config/cycle.php
179+
return [
180+
'default' => env('DB_CONNECTION', 'sqlite'),
181+
182+
'connections' => [
183+
'sqlite' => [
184+
'driver' => 'sqlite',
185+
'database' => env('DB_DATABASE', ':memory:'),
186+
],
187+
'mysql' => [
188+
'driver' => 'mysql',
189+
'host' => env('DB_HOST', 'localhost'),
190+
'port' => env('DB_PORT', 3306),
191+
'database' => env('DB_DATABASE', 'express_php'),
192+
'username' => env('DB_USERNAME', 'root'),
193+
'password' => env('DB_PASSWORD', ''),
194+
],
195+
],
196+
197+
'entities' => [
198+
'directories' => [
199+
__DIR__ . '/../src/Domain/Entities',
200+
],
201+
],
202+
203+
'cache' => [
204+
'enabled' => env('CYCLE_CACHE_ENABLED', true),
205+
'directory' => env('CYCLE_CACHE_DIR', __DIR__ . '/../storage/cache/cycle'),
206+
],
207+
];
208+
```
209+
106210
### Repository Factory com Cache
107211
```php
108212
$factory = $app->get('cycle.repository');
@@ -112,18 +216,84 @@ $userRepo = $factory->getRepository(User::class); // Cached automatically
112216
### Middleware de Transação
113217
```php
114218
$app->use(new TransactionMiddleware($app));
219+
220+
// Transações automáticas em rotas
221+
$app->post('/api/users', function ($req, $res) {
222+
// Transação iniciada automaticamente
223+
// Commit automático em sucesso
224+
// Rollback automático em erro
225+
});
115226
```
116227

117228
### Sistema de Monitoramento
118229
```php
119230
use CAFernandes\ExpressPHP\CycleORM\Monitoring\MetricsCollector;
120231

121-
// Métricas automáticas de queries, cache, etc.
232+
// Ativar profiling de queries
233+
$_ENV['CYCLE_PROFILE_QUERIES'] = true;
234+
$_ENV['CYCLE_LOG_QUERIES'] = true;
235+
236+
// Coletar métricas
122237
$metrics = MetricsCollector::getMetrics();
238+
// Exibe: queries executadas, tempo de execução, cache hits/misses
123239
```
124240

241+
### Container de Injeção de Dependência
242+
```php
243+
// Registrar repositórios no container
244+
$container->bind(UserRepositoryInterface::class, function ($container) {
245+
return new UserRepository(
246+
$container->get('cycle.database')
247+
);
248+
});
249+
250+
// Usar em controllers
251+
$userController = $container->get(UserController::class);
252+
```
253+
254+
## 📚 Exemplos de Implementação
255+
256+
### API CRUD Completa
257+
```php
258+
// Estrutura de pastas recomendada
259+
├── src/
260+
│ ├── Domain/
261+
│ │ ├── Entities/
262+
│ │ │ └── User.php
263+
│ │ └── Repositories/
264+
│ │ └── UserRepositoryInterface.php
265+
│ ├── Infrastructure/
266+
│ │ └── Repositories/
267+
│ │ └── UserRepository.php
268+
│ └── Application/
269+
│ ├── Controllers/
270+
│ │ └── UserController.php
271+
│ └── UseCases/
272+
│ └── CreateUserUseCase.php
273+
```
274+
275+
### Padrões de Implementação
276+
277+
A extensão suporta diferentes níveis de complexidade:
278+
279+
1. **Nível Básico**: Acesso direto ao banco via Cycle Database
280+
- Ideal para MVPs e prototipagem rápida
281+
- Queries SQL diretas com segurança
282+
- Mínima configuração necessária
283+
284+
2. **Nível Intermediário**: Padrão Repository
285+
- Organização do código em camadas
286+
- Facilita testes e manutenção
287+
- Reutilização de lógica de negócio
288+
289+
3. **Nível Avançado**: Clean Architecture
290+
- Separação completa de responsabilidades
291+
- Use Cases e Value Objects
292+
- Máxima testabilidade e flexibilidade
293+
125294
## 📚 Documentação Completa
126295

296+
- [Guia Completo - Do Básico ao Avançado](docs/guia-completo.md)
127297
- [Documentação Principal](docs/index.md)
128298
- [Guia de Contribuição](CONTRIBUTING.md)
129299
- [Arquitetura Técnica](docs/techinical/)

0 commit comments

Comments
 (0)