🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano
ClockAwareTrait — внедрение часов сеттером
Назначение
Трейт для сервисов: setClock() + защищённый now(); без установки — глобальные часы. Паритет с symfony ClockAwareTrait, но без обязательного контейнера.
Для чего и как применять
Лёгкое подключение управляемого времени в существующие классы: подмешать трейт, в тестах setClock(new MockClock(...)).
Пример
final class ReportService
{
use ClockAwareTrait;
public function build(): Report
{
return new Report(generatedAt: $this->now());
}
}
// В тесте:
$service->setClock(FrozenClock::from('2026-01-01', 'UTC'));
Анти-паттерны
Для новых сервисов конструкторное внедрение ClockInterface прозрачнее сеттера.
Жизненный цикл
flowchart LR
A[Service + ClockAwareTrait] -->|now()| B{clock set?}
B -->|yes| C[Injected clock]
B -->|no| D[ClockHolder global]
Сравнение возможности с аналогами
| Аспект | 🏆 CloudCastle | symfony | carbon | lcobucci | beste | ergebnis |
|---|---|---|---|---|---|---|
| Сеттер-инъекция часов | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Фолбэк на глобальные часы | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Без обязательного контейнера | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
Защищённый now() для наследников | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Всего | 🏆 4 | 3 | 0 | 0 | 0 | 0 |
🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano