Новое в Symfony 6.3 — Улучшения Clock
В Symfony 6.2 мы представили новый компонент Clock
, чтобы вы могли отделить свои приложения от системных часов (например, для создания более чувствительных ко времени тестов). В Symfony 6.3 мы улучшили его новыми возможностями.
Добавлен класс Clock
и функция now()
В Symfony 6.2 мы представили ClockInterface
и три конкретные реализации: NativeClock
, ClockMock
и MonotonicClock
. В Symfony 6.3 мы представляем новый класс Clock
возвращающий текущее время и позволяющий использовать любую реализацию интерфейса, описанного в спецификации PSR-20: Clock, в качестве глобальных часов в вашем приложении:
use Symfony\Component\Clock\Clock;
use Symfony\Component\Clock\MockClock;
// Вы можете установить собственную реализацию часов или использовать NativeClock по умолчанию.
Clock::set(new MockClock());
// Затем вы можете получить экземпляр часов.
$clock = Clock::get();
// Отсюда вы можете получить текущее время
$now = $clock->now();
// А также отправить приложение в сон на заданное время
$clock->sleep(2.5);
Мы также добавили функцию now()
, которую вы можете использовать в любом месте приложения для получения текущего времени:
use function Symfony\Component\Clock\now;
$now = now(); // возвращает экземпляр DateTimeImmutable
Теперь Symfony подключает эти глобальные часы как сервис, поэтому внедрение ClockInterface
или использование now()
, или Clock:get()
возвращает одно и то же время.
Добавлен ClockAwareTrait
Благодаря ClockInterface
вы можете обновлять свои чувствительные ко времени сервисы следующим образом:
class StoreSchedule
{
public function __construct(
// ...
+ private ClockInterface $clock
) {
}
public function isOpen(): bool
{
- $now = new \DateTimeImmutable();
+ $now = $this->clock->now();
return $this->openTime > $now && ...;
}
}
Однако для тех, кто предпочитает не внедрять новые зависимости в свои конструкторы сервисов, мы также добавили трейт, чтобы вам было проще его использовать:
class Store
{
+ use ClockAwareTrait;
public function __construct(
// ...
) {
}
public function isOpen(): bool
{
- $now = new \DateTimeImmutable();
+ $now = $this->now();
return $this->openTime > $now && ...;
}
}
Поддержка Clock
в других компонентах
В Symfony 6.3 мы также продолжили интегрировать компонент Clock
в другие функции Symfony, такие, как:
- Добавлена поддержка
Clock
в Messenger Workers (изменение внесённое Fabien Potencier в PR #49730) - Использование
Clock
в преобразователях значений аргументовDateTime
(изменение внесено Jérôme Tamarelle в PR #48098)