FiltersConfigurationService.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. <?php
  2. namespace App\Service\Doctrine;
  3. use App\Filter\Doctrine\TimeConstraint\AbstractTimeFilter;
  4. use App\Filter\Doctrine\TimeConstraint\ActivityYearFilter;
  5. use App\Filter\Doctrine\TimeConstraint\DatetimeFilter;
  6. use App\Service\Constraint\ActivityYearConstraint;
  7. use App\Service\Constraint\DateTimeConstraint;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use Doctrine\ORM\Query\FilterCollection;
  10. /**
  11. * Service de configuration des filtres doctrine.
  12. *
  13. * @see src/EventListener/OnKernelRequestPreRead.php
  14. */
  15. class FiltersConfigurationService
  16. {
  17. /**
  18. * L'état du des filtres de contrainte de temps avant l'utilisation de la méthode suspendTimeConstraintFilters()
  19. * Si $previousTimeConstraintState est `true`, les filtres étaient activés, et si c'est `false`, les filtres
  20. * étaient désactivés. Si les filtres ne sont pas suspendus, $previousTimeConstraintState est null.
  21. */
  22. private ?bool $previousTimeConstraintState = null;
  23. public function __construct(
  24. private EntityManagerInterface $entityManager,
  25. private DateTimeConstraint $dateTimeConstraint,
  26. private ActivityYearConstraint $activityYearConstraint,
  27. ) {
  28. }
  29. /**
  30. * Return the existing Doctrine SQLFilters.
  31. */
  32. protected function getFilters(): FilterCollection
  33. {
  34. return $this->entityManager->getFilters();
  35. }
  36. /**
  37. * Enable and preconfigure the doctrine sql filters that apply the time constraints.
  38. */
  39. public function configureTimeConstraintFilters(int $accessId): void
  40. {
  41. /** @var DatetimeFilter $dateTimeFilter */
  42. $dateTimeFilter = $this->getFilters()->enable('date_time_filter');
  43. $dateTimeFilter->setAccessId($accessId);
  44. $dateTimeFilter->setTimeConstraint($this->dateTimeConstraint);
  45. /** @var ActivityYearFilter $activityYearFilter */
  46. $activityYearFilter = $this->getFilters()->enable('activity_year_filter');
  47. $activityYearFilter->setAccessId($accessId);
  48. $activityYearFilter->setTimeConstraint($this->activityYearConstraint);
  49. }
  50. /**
  51. * Suspends les contraintes de temps. Celles-ci pourront être restorées grâce à la méthode
  52. * restoreTimeConstraintFilters().
  53. *
  54. * @see src/Filter/Doctrine/TimeConstraint/AbstractTimeFilter.php
  55. */
  56. public function suspendTimeConstraintFilters(): void
  57. {
  58. if ($this->previousTimeConstraintState !== null) {
  59. throw new \RuntimeException('date_time_filter is already suspended');
  60. }
  61. $filters = $this->entityManager->getFilters();
  62. if (!$filters->isEnabled('date_time_filter')) {
  63. $this->previousTimeConstraintState = false;
  64. return;
  65. }
  66. /** @var AbstractTimeFilter $filter */
  67. $filter = $filters->getFilter('date_time_filter');
  68. $this->previousTimeConstraintState = $filter->isDisabled() === false;
  69. $filter->setDisabled(true);
  70. }
  71. /**
  72. * Restore les contraintes de temps après qu'elles aient été suspendues au moyen de la
  73. * méthode suspendTimeConstraintFilters().
  74. *
  75. * @see src/Filter/Doctrine/TimeConstraint/AbstractTimeFilter.php
  76. */
  77. public function restoreTimeConstraintFilters(): void
  78. {
  79. if ($this->previousTimeConstraintState === null) {
  80. throw new \RuntimeException('date_time_filter has not been suspended, can not be restored');
  81. }
  82. $filters = $this->entityManager->getFilters();
  83. if ($filters->isEnabled('date_time_filter')) {
  84. /** @var AbstractTimeFilter $filter */
  85. $filter = $filters->getFilter('date_time_filter');
  86. $filter->setDisabled($this->previousTimeConstraintState);
  87. }
  88. $this->previousTimeConstraintState = null;
  89. }
  90. }