Skip to content

Commit 35eb6e0

Browse files
committed
Update readme
1 parent b77093c commit 35eb6e0

2 files changed

Lines changed: 116 additions & 50 deletions

File tree

ROADMAP.md

Lines changed: 83 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Roadmap BowPHP Framework
22

33
> Document évolutif basé sur l'analyse du code source (branche 5.x) et le manifeste du projet.
4-
> Dernière mise à jour : Janvier 2026
4+
> Dernière mise à jour : Mai 2026
55
66
---
77

@@ -56,35 +56,89 @@
5656

5757
---
5858

59+
## ✅ Récemment livré (printemps 2026)
60+
61+
Faits saillants des dernières itérations — déjà mergés sur `5.x`. Tous les détails dans le CHANGELOG.
62+
63+
### Routing
64+
65+
- Routage par attributs PHP 8 (cf. section dédiée plus bas).
66+
- `Router::$routes` rendu instance (corrige les fuites d'état entre tests).
67+
- Préfixe de nom du `#[Controller]` appliqué aux routes filles ; méthodes héritées ignorées au scan.
68+
69+
### Barry ORM
70+
71+
- Trait `SoftDelete` (`delete``deleted_at`, `restore`, `forceDelete`, `withTrashed` / `onlyTrashed` / `withoutTrashed`, événements `model.restoring/restored/forceDeleting/forceDeleted`).
72+
- Cast `array` réparé : ne renvoie plus un `stdClass`.
73+
- Propriété morte `$soft_delete` supprimée (remplacée par le trait).
74+
- Visibilité `EventTrait::fireEvent` / `formatEventName` élargie à `protected` pour les traits enfants.
75+
76+
### Validation
77+
78+
- Nouvelles règles : `url`, `ip` (+ `ip:v4`, `ip:v6`), `boolean`, `json`, `uuid`, `confirmed`, `different:field`, `between:min,max`.
79+
- Priorité corrigée : `nullable|required` laisse `required` s'exécuter (et l'inner-loop break utilise enfin la bonne variable).
80+
81+
### Infrastructure de test
82+
83+
- `TestCase` refactoré : vrai DELETE/PATCH (plus de hack `_method`), `head()` / `options()`, factorisation via `newHttpClient()`, reset auto des attachements, port par défaut 8080.
84+
- `Env::reset()` ajouté pour la propreté entre suites de tests.
85+
- `SchedulerCommand` charge automatiquement `routes/scheduler.php` et tolère un Loader manquant.
86+
- `addEnum` / `changeEnum` : messages d'erreur explicites (mentionnent la clé `size`).
87+
- Bootstrap des tests filtre les `E_DEPRECATED` issus de `vendor/` (lcobucci/jwt v3.2.5, spatie 4.x).
88+
- Pagination : tests appelaient `total()` au lieu de `totalPages()` — 24 cas corrigés.
89+
90+
### Tintin (vendoré)
91+
92+
- Cache atomique (`rename`), `mkdir` récursif, invalidation par `filemtime` (au lieu de `fileatime`).
93+
- `Compiler::compile` ne perd plus les lignes vides ; ajout d'un post-pass `?>\n\n` pour préserver l'indentation des snippets `<pre>/<code>`.
94+
- `Tintin::renderString` utilise `tempnam()` + `try/finally` ; suppression du `trim()` destructif.
95+
- Heuristique d'échappement `{{ ... }}` resserrée mais compatible Vue/Angular.
96+
- `directivesProtected` enrichi (csrf, macro/endmacro, lang, flash, notempty…).
97+
98+
### Documentation & READMEs
99+
100+
- Audit complet de `docs/docs/*.mdx` (ORM, Router, Validation, Migration, Mail, Storage, Messaging, Container, Pagination, Scheduler, Task, Testing, Configuration, Concept, Controller, CQRS, Database, Policier, Service, Session, SoAuth, Structure, Upload, View, Package, Contribution).
101+
- README mis à jour (badges, compteurs de tests, soft delete, attribut routing, helpers de commande).
102+
- `microservice` (sous-projet) : refactor de `MicroserviceConfiguration` (extends `Configuration`, PSR-4 propre), `microservice.php` Bow-intégré, namespace `Bow\Console\Command\Generator` corrigé.
103+
104+
---
105+
59106
## 🔴 NOW — 0 à 3 mois (Stabilisation & Consolidation)
60107

61108
### Tests et CI/CD
62109

63-
| Tâche | Statut | Priorité | Notes |
64-
| --------------------------------------------------- | ---------- | -------- | ------------------------------------------------------ |
65-
| Séparer les tests unitaires des tests d'intégration | ⏳ À faire | Haute | Les tests DB/FTP/S3 nécessitent des services externes |
66-
| Ajouter `@group` PHPUnit pour isoler les tests | ⏳ À faire | Haute | `@group unit`, `@group integration`, `@group database` |
67-
| Configurer GitHub Actions avec services Docker | ⏳ À faire | Haute | MySQL, PostgreSQL, Redis pour CI |
68-
| Augmenter couverture tests unitaires > 80% | ⏳ À faire | Moyenne | Focus sur modules critiques |
69-
| Intégrer PHPStan niveau 5+ | ⏳ À faire | Moyenne | Actuellement niveau 0.12.87 |
110+
| Tâche | Statut | Priorité | Notes |
111+
| --------------------------------------------------- | ------------ | -------- | ------------------------------------------------------ |
112+
| Séparer les tests unitaires des tests d'intégration | ⏳ À faire | Haute | Les tests DB/FTP/S3 nécessitent des services externes |
113+
| Ajouter `@group` PHPUnit pour isoler les tests | ⏳ À faire | Haute | `@group unit`, `@group integration`, `@group database` |
114+
| Configurer GitHub Actions avec services Docker | ⏳ À faire | Haute | MySQL, PostgreSQL, Redis pour CI |
115+
| Augmenter couverture tests unitaires | 🔄 En cours | Moyenne | 1 600+ tests, 0 échec logique. Ajouts récents : SoftDelete, AttributeRouteRegistrar, nouvelles règles de validation, Pagination. |
116+
| Intégrer PHPStan niveau 5+ | ⏳ À faire | Moyenne | Constraint actuel : `phpstan/phpstan: ^0.12.87` — bumper vers ^1.x avant de cibler un niveau plus élevé |
70117

71118
### Corrections de Code
72119

73-
| Tâche | Statut | Priorité | Notes |
74-
| ----------------------------------------------- | ---------- | -------- | ------------------------------------- |
75-
| Fixer les tests SQLite qui échouent (isolation) | ⏳ À faire | Haute | Problème de state partagé entre tests |
76-
| Uniformiser les signatures de méthodes | ✅ Fait | - | PHP 8.1+ nullable types |
77-
| Fixer le cast `(double)``(float)` | ✅ Fait | - | Model.php ligne 924 |
78-
| Gérer `array_key_exists` avec clé null | ✅ Fait | - | Console.php |
79-
| Créer le répertoire de test si inexistant | ✅ Fait | - | CustomCommand.php |
120+
| Tâche | Statut | Priorité | Notes |
121+
| -------------------------------------------------------------------- | ---------- | -------- | ---------------------------------------------------------------------- |
122+
| Fixer le test d'attribut middleware (state partagé entre tests) | ✅ Fait | - | `Router::$routes` rendue instance (n'était plus partagée entre tests) |
123+
| Fixer les tests Pagination qui appelaient `total()` au lieu de `totalPages()` | ✅ Fait | - | 24 tests corrigés |
124+
| Fixer le cast `array` du modèle Barry qui renvoyait `stdClass` | ✅ Fait | - | `Model::executeDataCasting` + `parseToJson($value, assoc: true)` |
125+
| Fixer la priorité `nullable\|required` du Validator | ✅ Fait | - | `nullable` ne court-circuite plus `required` |
126+
| Fixer `EnvTest` (pollution du singleton entre tests) | ✅ Fait | - | `Env::reset()` ajouté |
127+
| Fixer `SchedulerCommand` (chargement de `routes/scheduler.php`) | ✅ Fait | - | `loadSchedulerFile()` mis à jour, tolère un Loader manquant |
128+
| Retirer la propriété morte `Model::$soft_delete` | ✅ Fait | - | Remplacée par un trait fonctionnel (cf. Soft delete plus bas) |
129+
| Améliorer les messages d'erreur de `addEnum` / `changeEnum` | ✅ Fait | - | Mentionnent explicitement la clé `size` |
130+
| Uniformiser les signatures de méthodes | ✅ Fait | - | PHP 8.1+ nullable types |
131+
| Fixer le cast `(double)``(float)` | ✅ Fait | - | Model.php |
132+
| Gérer `array_key_exists` avec clé null | ✅ Fait | - | Console.php |
133+
| Créer le répertoire de test si inexistant | ✅ Fait | - | CustomCommand.php |
80134

81135
### Documentation
82136

83-
| Tâche | Statut | Priorité | Notes |
84-
| -------------------------------------------- | ---------- | -------- | -------------------------- |
85-
| Mettre à jour README avec exemples API-first | ⏳ À faire | Moyenne | Aligner avec le manifeste |
86-
| Documenter les configurations requises | ⏳ À faire | Moyenne | Chaque module |
87-
| Créer guide de contribution détaillé | ⏳ À faire | Basse | Au-delà du CONTRIBUTING.md |
137+
| Tâche | Statut | Priorité | Notes |
138+
| -------------------------------------------- | ------------ | -------- | ----------------------------------------------------------- |
139+
| Mettre à jour README avec exemples API-first | ✅ Fait | - | Compteurs de tests, exemples corrigés (`User::retrieve`, `persist()`, `$app`), attribut routing et soft delete mis en avant |
140+
| Documenter les configurations requises | ✅ Fait | - | Audit complet de `docs/docs/*.mdx` (ORM, Router, Validation, Migration, Storage, Mail, Notifier, Container, Pagination, Scheduler, Task, etc.) |
141+
| Créer guide de contribution détaillé | ⏳ À faire | Basse | Au-delà du CONTRIBUTING.md |
88142

89143
---
90144

@@ -98,14 +152,16 @@
98152
| Implémenter delayed jobs avec Redis ZADD | ⏳ À faire | Haute | |
99153
| Ajouter monitoring des queues via CLI | ⏳ À faire | Moyenne | `bow queue:status` |
100154

101-
### Router - Attributs PHP 8
155+
### Router - Attributs PHP 8 ✅ Livré
102156

103-
| Tâche | Statut | Priorité | Notes |
104-
| ------------------------------------------------------ | ---------- | -------- | --------------------- |
105-
| Créer namespace `Bow\Router\Attributes` | ⏳ À faire | Haute | |
106-
| Implémenter `#[Controller]` | ⏳ À faire | Haute | prefix, middleware |
107-
| Implémenter `#[Get]`, `#[Post]`, `#[Put]`, `#[Delete]` | ⏳ À faire | Haute | |
108-
| Ajouter `$router->register(Controller::class)` | ⏳ À faire | Haute | Auto-discovery routes |
157+
| Tâche | Statut | Priorité | Notes |
158+
| ------------------------------------------------------ | ------- | -------- | -------------------------------------------------------------------- |
159+
| Créer namespace `Bow\Router\Attributes` | ✅ Fait | - | `src/Router/Attributes/` |
160+
| Implémenter `#[Controller]` | ✅ Fait | - | `prefix`, `middleware`, `name` (préfixe de nom de route) |
161+
| Implémenter `#[Get]`, `#[Post]`, `#[Put]`, `#[Delete]` | ✅ Fait | - | + `#[Patch]`, `#[Options]`, `#[Route]` (multi-verbes), tous répétables |
162+
| Ajouter `$app->register(Controller::class)` | ✅ Fait | - | Accepte aussi un tableau de contrôleurs |
163+
| `AttributeRouteRegistrar` | ✅ Fait | - | Refactoré : préfixe de nom appliqué, méthodes héritées ignorées, sous-classe d'attribut acceptée |
164+
| Tests + stubs | ✅ Fait | - | `tests/Routing/AttributeRouteIntegrationTest.php` |
109165

110166
### Cache - Adapter Memcached
111167

readme.md

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22

33
[![docs](https://img.shields.io/badge/docs-read%20docs-blue.svg?style=flat-square)](https://github.com/bowphp/docs)
44
[![version](https://img.shields.io/packagist/v/bowphp/framework.svg?style=flat-square)](https://packagist.org/packages/bowphp/framework)
5-
[![license](https://img.shields.io/github/license/mashape/apistatus.svg?style=flat-square)](https://github.com/bowphp/framework/blob/main/LICENSE)
6-
[![Build Status](https://img.shields.io/travis/bowphp/framework/main.svg?style=flat-square)](https://travis-ci.org/bowphp/framework)
5+
[![license](https://img.shields.io/github/license/bowphp/framework.svg?style=flat-square)](https://github.com/bowphp/framework/blob/main/LICENSE)
76
![Build Status](https://github.com/bowphp/framework/actions/workflows/tests.yml/badge.svg)
87

98
> A lightweight, modern PHP framework designed for building web applications with clean architecture and modular design.
@@ -26,7 +25,7 @@ Bow Framework is a lightweight PHP framework created by Franck DAKIA that emphas
2625
- Modular architecture with 20+ independent components
2726
- Lightweight and fast with minimal dependencies
2827
- Full-stack framework with everything you need
29-
- Well-tested with 1,110+ tests and 94% success rate
28+
- Well-tested: 1,600+ tests, 3,300+ assertions, zero logical failures
3029
- Active development with regular updates
3130

3231
## Core Features
@@ -37,17 +36,20 @@ Bow Framework is a lightweight PHP framework created by Franck DAKIA that emphas
3736
- **Query Builder**: Fluent, expressive database queries
3837
- **Multi-database**: MySQL, PostgreSQL, SQLite support
3938
- **Migrations**: Version control for database schema
40-
- **Relationships**: BelongsTo, HasMany, ManyToMany
39+
- **Relationships**: HasOne, HasMany, BelongsTo, BelongsToMany
40+
- **Soft delete**: `SoftDelete` trait with `delete`/`restore`/`forceDelete` and `withTrashed`/`onlyTrashed` query scopes
4141
- **Pagination**: Built-in pagination support
4242

4343
### Routing System
4444

45-
- Simple, expressive routing syntax
45+
- Simple, expressive routing syntax (`$app->get`, `$app->post`, ...)
46+
- **PHP 8 attribute routing**: `#[Controller]`, `#[Get]`, `#[Post]`, `#[Put]`, `#[Patch]`, `#[Delete]`, `#[Options]`, `#[Route]`
4647
- RESTful resource routing with automatic CRUD operations
4748
- Route naming for easy URL generation
4849
- Route parameters with regex constraints
49-
- Middleware support per route or route group
50-
- Route prefix support for grouping
50+
- Middleware support per route or route group, with `name:arg` parameter syntax
51+
- Route prefix and domain grouping
52+
- Custom HTTP error handlers via `code()`
5153

5254
### Mail System
5355

@@ -186,16 +188,19 @@ php bow serve
186188

187189
```php
188190
// routes/app.php
189-
$route->get('/', function () {
191+
$app->get('/', function () {
190192
return 'Hello World!';
191193
});
192194

193-
$route->get('/users/:id', function ($id) {
195+
$app->get('/users/:id', function ($id) {
194196
return "User ID: $id";
195197
});
196198

197199
// RESTful resource routing
198-
$route->rest('/api/posts', PostController::class);
200+
$app->rest('/api/posts', 'PostController');
201+
202+
// Attribute-based controllers (no central route file required)
203+
$app->register(\App\Controllers\PostController::class);
199204
```
200205

201206
**Create a Controller:**
@@ -215,7 +220,10 @@ class PostController
215220

216221
public function store(Request $request)
217222
{
218-
return Post::create($request->all());
223+
$post = Post::create($request->all());
224+
$post->persist();
225+
226+
return $post;
219227
}
220228
}
221229
```
@@ -224,12 +232,13 @@ class PostController
224232

225233
```php
226234
use App\Models\User;
235+
use Bow\Database\Database;
227236

228237
// Using Barry ORM
229-
$user = User::find(1);
238+
$user = User::retrieve(1);
230239
$users = User::where('active', true)->get();
231240

232-
// Using Query Builder
241+
// Using the Query Builder
233242
$users = Database::table('users')
234243
->where('role', 'admin')
235244
->orderBy('created_at', 'desc')
@@ -238,21 +247,22 @@ $users = Database::table('users')
238247

239248
## Code Quality & Testing
240249

241-
### Current Status (v5.1.7)
250+
### Current Status
242251

243-
- **Test Suite**: 1,110+ tests with 2,498+ assertions
244-
- **Success Rate**: 94% (remaining failures are external service dependencies)
245-
- **Code Style**: PSR-12 compliant
252+
- **Test Suite**: 1,600+ tests with 3,300+ assertions
253+
- **Logical failures**: 0 — the only remaining errors require external services (FTP server, S3 endpoint) and are skipped by default
254+
- **Code Style**: PSR-12 (`composer phpcs` to check, `composer phpcbf` to fix)
255+
- **Static analysis**: PHPStan in `require-dev` (`vendor/bin/phpstan analyse src`)
246256
- **PHP Version**: 8.1+ with modern features
247257

248258
### Recent Improvements
249259

250-
The framework is actively maintained with recent major refactoring:
251-
252-
- **SMTP Adapter**: Complete rewrite (8 → 21 methods, RFC-compliant)
253-
- **FTP Service**: Enhanced with retry logic and better error handling
254-
- **Queue System**: Graceful logger fallback
255-
- **Test Quality**: 39% fewer errors, 70% fewer failures
260+
- **SMTP Adapter**: Complete rewrite (8 → 21 methods, RFC-compliant)
261+
- **FTP Service**: Enhanced with retry logic and better error handling
262+
- **Queue System**: Graceful logger fallback
263+
- **Attribute routing**: PHP 8 `#[Controller]` / `#[Get]` / `#[Post]` / ... wiring via `$app->register(...)`
264+
- **Barry soft delete**: trait + query scopes (`withTrashed`, `onlyTrashed`, `withoutTrashed`)
265+
- **Router**: instance-level route storage (no more cross-test leakage)
256266
- **PHP 8.x**: Modernized code style (arrow functions, union types)
257267

258268
See [CHANGELOG.md](CHANGELOG.md) for full details.

0 commit comments

Comments
 (0)