🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano
ClockAwareTrait — injection de l’horloge par setter
Objectif
Un trait pour les services : setClock() + un now() protégé ; à défaut de configuration, l’horloge globale est utilisée. À parité avec le ClockAwareTrait de symfony, mais sans conteneur obligatoire.
À quoi ça sert et comment l’utiliser
Adoption légère d’un temps maîtrisé dans des classes existantes : intégrez le trait, puis dans les tests appelez setClock(new MockClock(...)).
Exemple
final class ReportService
{
use ClockAwareTrait;
public function build(): Report
{
return new Report(generatedAt: $this->now());
}
}
// In a test:
$service->setClock(FrozenClock::from('2026-01-01', 'UTC'));
Anti-modèles
Pour les nouveaux services, l’injection de ClockInterface par le constructeur est plus transparente qu’un setter.
Cycle de vie
flowchart LR
A[Service + ClockAwareTrait] -->|now()| B{clock set?}
B -->|yes| C[Injected clock]
B -->|no| D[ClockHolder global]
Comparaison de la fonctionnalité avec les concurrents
| Aspect | 🏆 CloudCastle | symfony | carbon | lcobucci | beste | ergebnis |
|---|---|---|---|---|---|---|
| Injection de l’horloge par setter | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Repli sur l’horloge globale | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Sans conteneur obligatoire | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
now() protégé pour les sous-classes | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Total | 🏆 4 | 3 | 0 | 0 | 0 | 0 |
← Retour à la liste des fonctionnalités
🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano