🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano
ClockAwareTrait — Uhr-Injektion per Setter
Zweck
Ein Trait für Services: setClock() + geschütztes now(); ohne Setzen greift die globale Uhr. Parität mit symfony ClockAwareTrait, jedoch ohne erforderlichen Container.
Wofür und wie einzusetzen
Leichtgewichtige verwaltete Zeit für bestehende Klassen: den Trait einbinden, in Tests setClock(new MockClock(...)) aufrufen.
Beispiel
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-Muster
Für neue Services ist die Konstruktor-Injektion der ClockInterface klarer als ein Setter.
Lebenszyklus
flowchart LR
A[Service + ClockAwareTrait] -->|now()| B{clock set?}
B -->|yes| C[Injected clock]
B -->|no| D[ClockHolder global]
Funktionsvergleich mit Alternativen
| Aspekt | 🏆 CloudCastle | symfony | carbon | lcobucci | beste | ergebnis |
|---|---|---|---|---|---|---|
| Uhr-Injektion per Setter | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Rückgriff auf die globale Uhr | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Kein erforderlicher Container | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
Geschütztes now() für Unterklassen | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Gesamt | 🏆 4 | 3 | 0 | 0 | 0 | 0 |
🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano