CloudCastle Clock

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

ClockAwareTrait — inyección del reloj mediante setter

Propósito

Un trait para servicios: setClock() + now() protegido; sin configurarlo — el reloj global. Paridad con el ClockAwareTrait de symfony, pero sin contenedor obligatorio.

Para qué y cómo usarlo

Incorporación ligera de tiempo controlado en clases existentes: mezcla el trait y, en las pruebas, setClock(new MockClock(...)).

Ejemplo

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'));

Antipatrones

Para servicios nuevos, la inyección de ClockInterface por constructor es más transparente que un setter.

Ciclo de vida

flowchart LR
    A[Service + ClockAwareTrait] -->|now()| B{clock set?}
    B -->|yes| C[Injected clock]
    B -->|no| D[ClockHolder global]

Comparación de la característica con alternativas

Aspecto🏆 CloudCastlesymfonycarbonlcobuccibesteergebnis
Inyección del reloj por setter✅✅❌❌❌❌
Respaldo en el reloj global✅✅❌❌❌❌
Sin contenedor obligatorio✅❌❌❌❌❌
now() protegido para herederos✅✅❌❌❌❌
Total🏆 430000

← Volver a la lista de características


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