|
1 | 1 | # Roadmap BowPHP Framework |
2 | 2 |
|
3 | 3 | > 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 |
5 | 5 |
|
6 | 6 | --- |
7 | 7 |
|
|
56 | 56 |
|
57 | 57 | --- |
58 | 58 |
|
| 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 | + |
59 | 106 | ## 🔴 NOW — 0 à 3 mois (Stabilisation & Consolidation) |
60 | 107 |
|
61 | 108 | ### Tests et CI/CD |
62 | 109 |
|
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é | |
70 | 117 |
|
71 | 118 | ### Corrections de Code |
72 | 119 |
|
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 | |
80 | 134 |
|
81 | 135 | ### Documentation |
82 | 136 |
|
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 | |
88 | 142 |
|
89 | 143 | --- |
90 | 144 |
|
|
98 | 152 | | Implémenter delayed jobs avec Redis ZADD | ⏳ À faire | Haute | | |
99 | 153 | | Ajouter monitoring des queues via CLI | ⏳ À faire | Moyenne | `bow queue:status` | |
100 | 154 |
|
101 | | -### Router - Attributs PHP 8 |
| 155 | +### Router - Attributs PHP 8 ✅ Livré |
102 | 156 |
|
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` | |
109 | 165 |
|
110 | 166 | ### Cache - Adapter Memcached |
111 | 167 |
|
|
0 commit comments