-
Notifications
You must be signed in to change notification settings - Fork 0
Feature Clock holder
github-actions[bot] edited this page Jul 14, 2026
·
1 revision
Одна точка доступа к часам приложения: код без DI читает время из слота, тесты подменяют его на управляемые часы одной строкой.
ClockHolder — статический слот. Без явной установки возвращает
SystemClock::system(); reset() возвращает дефолт:
use CloudCastle\Clock\ClockHolder;
use CloudCastle\Clock\MockClock;
// В bootstrap-е теста:
ClockHolder::set(MockClock::from('2026-01-01 00:00:00', 'UTC'));
// Где угодно в коде:
$now = ClockHolder::now();
// В tearDown:
ClockHolder::reset();Фасад Clock добавляет короткие фабрики поверх слота:
use CloudCastle\Clock\Clock;
Clock::now(); // момент из глобального слота
Clock::system(); // SystemClock в зоне процесса
Clock::utc(); // кэшированный UTC
Clock::frozen('2026-01-01'); // FrozenClock
Clock::mock('2026-01-01', 'UTC'); // MockClock
Clock::monotonic(); // MonotonicClockФасад и слот оформлены так, что инстанцировать их невозможно — это чистые статические точки входа.
- Миграция легаси на управляемое время без тотальной перепрошивки конструкторов.
- Изоляция тестов:
reset()вtearDownгарантирует, что мок не утечёт в соседний тест.
- Глобальное состояние: в новом коде предпочтительнее явная инъекция
ClockInterface.
- Легаси-код и простые скрипты, где DI ещё нет.
- Точечная подмена времени в интеграционных тестах приложения целиком.
-
ClockHolder::set()в продакшн-коде по ходу выполнения — время должно настраиваться один раз в bootstrap. - Забытый
reset()в тестах — источник загадочных флаков (наш Security-сьют проверяет отсутствие утечки).
flowchart LR
APP[Любой код] -->|"ClockHolder::now()"| H[ClockHolder]
H -->|"слот установлен"| X[Установленные часы]
H -->|"слот пуст"| S["SystemClock::system()"]
F["фасад Clock"] --> H
stateDiagram-v2
[*] --> Дефолт: старт процесса
Дефолт --> Установлен: set(часы)
Установлен --> Установлен: get()/now()
Установлен --> Дефолт: reset()
Дефолт --> Дефолт: get() → SystemClock
| Возможность | Clock | symfony/clock | lcobucci/clock | beste/clock | nesbot/carbon | ergebnis/clock | 🏆 Победитель |
|---|---|---|---|---|---|---|---|
| Глобальный слот часов | ✅ | ✅ | ❌ | ❌ | ❌ | Clock + symfony/clock | |
| Дефолт без установки | ✅ | ✅ | — | — | — | Clock + symfony/clock | |
isSet()/reset() для изоляции тестов |
✅ | — | — | — | Clock | ||
| Статический фасад с фабриками | ✅ | ❌ | ❌ | ✅ | ❌ | Clock + nesbot/carbon |
CloudCastle Clock · · PHP 8.1+
GitHub · Packagist · Releases · Discussions · Issues
Email · Telegram · VK · Сетка · 💜 Поддержать проект
Исходники Wiki — каталог wiki/ в репозитории (синхронизация через GitHub Actions)