1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- <?php
- namespace App\Service;
- use App\Entity\Counter;
- use App\Repository\CounterRepository;
- use Doctrine\ORM\EntityManagerInterface;
- use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
- use Symfony\Component\HttpKernel\Event\ControllerEvent;
- use Symfony\Component\HttpKernel\KernelEvents;
- use Symfony\Component\Workflow\Attribute\AsCompletedListener;
- use Symfony\Component\Workflow\Attribute\AsEnteredListener;
- use Symfony\Component\Workflow\Event\Event;
- use Symfony\Component\Workflow\WorkflowInterface;
- class CounterManager
- {
- public function __construct(
- protected EntityManagerInterface $em,
- protected WorkflowInterface $countdownStateMachine,
- protected CounterRepository $counterRepository
- )
- {
- }
- #[AsEnteredListener('countdown', Counter::STATE_READY)]
- public function init(Event $event): void
- {
- /** @var Counter $counter */
- $counter = $event->getSubject();
- $this->em->persist($counter);
- $this->em->flush();
- }
- #[AsCompletedListener('countdown', Counter::TRANSITION_TO_STARTED)]
- public function started(Event $event): void
- {
- /** @var Counter $counter */
- $counter = $event->getSubject();
- $counter
- ->setStartTime(new \DateTimeImmutable('now'))
- ->setEndTime($counter->getStartTime()->add(new \DateInterval($counter->getTimeTolive())))
- ;
- $this->em->flush();
- }
- #[AsCompletedListener('countdown', Counter::TRANSITION_TO_COMPLETED)]
- public function completed(Event $event): void
- {
- return;
- }
- #[AsCompletedListener('countdown', Counter::TRANSITION_TO_READY)]
- public function toReady(Event $event): void
- {
- /** @var Counter $counter */
- $counter = $event->getSubject();
- $counter
- ->setStartTime(null)
- ->setEndTime(null)
- ;
- //$this->em->flush();
- }
- #[AsEventListener(KernelEvents::CONTROLLER)]
- public function onKernelController(ControllerEvent $event) {
- if (!$event->isMainRequest()) {
- return;
- }
- $counters = $this->counterRepository->findBy(['state' => Counter::STATE_STARTED]);
- foreach($counters as $counter) {
- if ($counter->getEndTime() <= new \DateTime('now')) {
- $this->countdownStateMachine->apply($counter, Counter::TRANSITION_TO_COMPLETED);
- }
- }
- $this->em->flush();
- }
- }
|