CloudCastle Clock

🇷🇺 Русский · 🇬🇧 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]

Сравнение возможности с аналогами

Аспект🏆 CloudCastlesymfonycarbonlcobuccibesteergebnis
Сеттер-инъекция часов✅✅❌❌❌❌
Фолбэк на глобальные часы✅✅❌❌❌❌
Без обязательного контейнера✅❌❌❌❌❌
Защищённый now() для наследников✅✅❌❌❌❌
Всего🏆 430000

← К списку возможностей


🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano