Architecture
Kohinos est une application Symfony monolithique structurée par bounded contexts métier (Account, Flux, SEPA, SSA, HelloAsso, PayZen, Notification, Admin). Les contrôleurs sont fins, la logique métier vit dans des services injectés par DI.
Vue par couches
flowchart TB
subgraph UI["UI"]
Twig["Twig + Bootstrap 5"]
Webpack["Webpack Encore
(entries par feature)"]
SonataAdmin["Sonata Admin 4.x
(B-Office)"]
ApiPlatform["API Platform 3.x"]
end
subgraph App["Application"]
Controllers["Controllers (fins)"]
Services["Services métier"]
Commands["Commands console
(cron)"]
Events["EventDispatcher
(effets de bord)"]
Subs["Event Subscribers"]
end
subgraph Domain["Domaine"]
Entities["Entities (Doctrine)"]
Enums["PHP 8.1+ Enums"]
Repos["Repositories
(find* uniquement)"]
Strategies["Strategies
(SSA, Gateways)"]
end
subgraph Infra["Infrastructure"]
Doctrine["Doctrine ORM 2.14"]
Mailer["symfony/mailer"]
Payum["Payum
(HelloAsso, PayZen)"]
Sodium["libsodium
(signatures SEPA)"]
end
DB[("MariaDB")]
UI --> Controllers
Controllers --> Services
Commands --> Services
Services --> Repos
Services --> Strategies
Services --> Events
Events --> Subs
Subs --> Mailer
Subs --> Sodium
Repos --> Doctrine
Doctrine --> DB
Services --> Payum
Couches applicatives et flux de dépendances.
Bounded contexts métier
Carte des contextes — survolez un contexte pour isoler ses dépendances
Appel synchrone
Événement (event dispatcher)
Commande Symfony (async)
Tous les contextes financiers convergent vers Flux & Operation — le pivot monétaire.
| Contexte | Responsabilité | Code (indicatif) |
|---|---|---|
| Account | Soldes, opérations, hiérarchie de comptes (Adhérent / Prestataire / Comptoir / Groupe / Siège). | src/Entity/Account* · src/Service/Account* |
| Flux & Operation | Pivot monétaire. STI (single table inheritance) sur Flux (Achat, Retrait, Change, Don, Cotisation, Transaction). |
src/Entity/Flux* · src/Entity/Operation* |
| SEPA | Mandats UMR, prélèvements récurrents, génération XML ISO 20022 (pain.008), validation trésorier. | src/Service/Sepa/* · src/Entity/SepaMandate · src/Entity/Recurring* |
| SSA | Fonds SSA, stratégies de redistribution (Calculated / Proportional / FixedAmount), alertes. | src/Service/Ssa/* · src/Entity/Solidoume* |
| HelloAsso / PayZen | Encaissement en ligne, webhooks idempotents, gateway Payum. | src/Service/Payment/* · src/Entity/HelloAsso · src/Entity/PendingPaymentData |
| Notification | Email via symfony/mailer, services centralisés, templates Twig. |
src/Service/Notification/* · templates/themes/kohinos/email/ |
| Admin (B-Office) | Tableaux de bord Sonata, batch actions, dashboards trésorier. | src/Admin/* |
Cycle d'une opération financière
sequenceDiagram
autonumber
participant C as Controller
participant S as Service métier
participant EM as EntityManager
participant DB as MariaDB
participant Sub as Event Subscriber
C->>S: requête métier (montant, source, cible)
S->>EM: wrapInTransaction()
EM->>DB: SELECT ... FOR UPDATE (lock pessimiste)
DB-->>EM: account row locked
S->>S: vérifie solde, signe l'Operation
S->>EM: persist(Flux), persist(Operation), update Account.balance
EM->>DB: COMMIT (atomique)
EM-->>Sub: postFlush event
Sub->>Sub: envoi email, hash chaînage, audit
S-->>C: succès
Atomicité : lock pessimiste + Operation persistée dans la même transaction.
Patterns architecturaux clés
- Service-oriented : la logique vit dans des services injectés par DI, jamais dans les contrôleurs.
- Repository pattern : tout DQL/QueryBuilder vit dans
src/Repository/. Méthodes typéesfind*. - Strategy : SSA (
Calculated|Proportional|FixedAmount), gateways (HelloAsso|PayZen). - Event dispatcher : effets de bord (notifs, audit, logs) hors du chemin critique.
- STI Doctrine :
FluxetRecurringSubscriptionRequestsont des tables uniques avec discriminator. - Double-flush : persist → flush (UUID disponible) → setter dépendant de l'UUID → flush.
- Lock pessimiste :
LockMode::PESSIMISTIC_WRITEsur tout compte modifié dans la transaction.
Arborescence haut-niveau
src/
├── Admin/ # Admins Sonata 4.x (B-Office)
├── Command/ # Commandes console (cron)
├── Controller/ # Contrôleurs fins
├── Entity/ # Entités Doctrine (attributs PHP 8)
├── EventSubscriber/
├── Form/
├── Repository/ # find* uniquement
├── Security/ # Voters, firewalls
├── Service/ # Logique métier (le cœur)
│ ├── Sepa/
│ ├── Ssa/
│ ├── Payment/
│ └── Notification/
└── Twig/
templates/themes/kohinos/ # Twig
assets/ # Webpack Encore entries
config/ # services.yaml, security.yaml, packages/
tests/ # PHPUnit (Unit, Service, Functional)
doc/ # Doc publique (install, dev guide)
docs/ # Doc privée (brainstorm, notes IA, rapports)