CounterManager.php 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. <?php
  2. namespace App\Service;
  3. use App\Entity\Counter;
  4. use App\Repository\CounterRepository;
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
  7. use Symfony\Component\HttpKernel\Event\ControllerEvent;
  8. use Symfony\Component\HttpKernel\KernelEvents;
  9. use Symfony\Component\Workflow\Attribute\AsCompletedListener;
  10. use Symfony\Component\Workflow\Attribute\AsEnteredListener;
  11. use Symfony\Component\Workflow\Event\Event;
  12. use Symfony\Component\Workflow\WorkflowInterface;
  13. class CounterManager
  14. {
  15. public function __construct(
  16. protected EntityManagerInterface $em,
  17. protected WorkflowInterface $countdownStateMachine,
  18. protected CounterRepository $counterRepository
  19. )
  20. {
  21. }
  22. #[AsEnteredListener('countdown', Counter::STATE_READY)]
  23. public function init(Event $event): void
  24. {
  25. /** @var Counter $counter */
  26. $counter = $event->getSubject();
  27. $this->em->persist($counter);
  28. $this->em->flush();
  29. }
  30. #[AsCompletedListener('countdown', Counter::TRANSITION_TO_STARTED)]
  31. public function started(Event $event): void
  32. {
  33. /** @var Counter $counter */
  34. $counter = $event->getSubject();
  35. $counter
  36. ->setStartTime(new \DateTimeImmutable('now'))
  37. ->setEndTime($counter->getStartTime()->add(new \DateInterval($counter->getTimeTolive())))
  38. ;
  39. $this->em->flush();
  40. }
  41. #[AsCompletedListener('countdown', Counter::TRANSITION_TO_COMPLETED)]
  42. public function completed(Event $event): void
  43. {
  44. return;
  45. }
  46. #[AsCompletedListener('countdown', Counter::TRANSITION_TO_READY)]
  47. public function toReady(Event $event): void
  48. {
  49. /** @var Counter $counter */
  50. $counter = $event->getSubject();
  51. $counter
  52. ->setStartTime(null)
  53. ->setEndTime(null)
  54. ;
  55. //$this->em->flush();
  56. }
  57. #[AsEventListener(KernelEvents::CONTROLLER)]
  58. public function onKernelController(ControllerEvent $event) {
  59. if (!$event->isMainRequest()) {
  60. return;
  61. }
  62. $counters = $this->counterRepository->findBy(['state' => Counter::STATE_STARTED]);
  63. foreach($counters as $counter) {
  64. if ($counter->getEndTime() <= new \DateTime('now')) {
  65. $this->countdownStateMachine->apply($counter, Counter::TRANSITION_TO_COMPLETED);
  66. }
  67. }
  68. $this->em->flush();
  69. }
  70. }