Clock
We are using the clock to get the current datetime. This is needed to create the recorded_on
datetime for the event stream.
We have two implementations of the clock, one for the production and one for the tests.
But you can also create your own implementation that is PSR-20 compatible.
For more information see here.
SystemClock
This uses the native system clock to return the DateTimeImmutable
instance.
use Patchlevel\EventSourcing\Clock\SystemClock;
$clock = new SystemClock();
$date = $clock->now(); // get the actual datetime
$date2 = $clock->now();
// $date == $date2 => false
// $date === $date2 => false
FrozenClock
This implementation should only be used for the tests. This enables you to freeze the time and with that to have deterministic tests.
use Patchlevel\EventSourcing\Clock\FrozenClock;
$date = new DateTimeImmutable();
$clock = new FrozenClock($date);
$frozenDate = $clock->now(); // gets the date provided before
// $date == $frozenDate => true
// $date === $frozenDate => false
FrozenClock
can also be updated with a new date, so you can test a jump in time.
use Patchlevel\EventSourcing\Clock\FrozenClock;
$firstDate = new DateTimeImmutable();
$clock = new FrozenClock($firstDate);
$secondDate = new DateTimeImmutable();
$clock->update($secondDate);
$frozenDate = $clock->now();
// $firstDate == $frozenDate => false
// $secondDate == $frozenDate => true
sleep
method to simulate a time jump.
use Patchlevel\EventSourcing\Clock\FrozenClock;
$firstDate = new DateTimeImmutable();
$clock = new FrozenClock($firstDate);
$clock->sleep(10); // sleep 10 seconds
Note
The instance of the frozen datetime will be cloned internally, so the it's not the same instance but equals.