| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- <?php
- namespace App\Service\Doctrine;
- use App\Filter\Doctrine\TimeConstraint\AbstractTimeFilter;
- use App\Filter\Doctrine\TimeConstraint\ActivityYearFilter;
- use App\Filter\Doctrine\TimeConstraint\DatetimeFilter;
- use App\Service\Constraint\ActivityYearConstraint;
- use App\Service\Constraint\DateTimeConstraint;
- use Doctrine\ORM\EntityManagerInterface;
- use Doctrine\ORM\Query\FilterCollection;
- /**
- * Service de configuration des filtres doctrine.
- *
- * @see src/EventListener/OnKernelRequestPreRead.php
- */
- class FiltersConfigurationService
- {
- /**
- * L'état du des filtres de contrainte de temps avant l'utilisation de la méthode suspendTimeConstraintFilters()
- * Si $previousTimeConstraintState est `true`, les filtres étaient activés, et si c'est `false`, les filtres
- * étaient désactivés. Si les filtres ne sont pas suspendus, $previousTimeConstraintState est null.
- */
- private ?bool $previousTimeConstraintState = null;
- public function __construct(
- private EntityManagerInterface $entityManager,
- private DateTimeConstraint $dateTimeConstraint,
- private ActivityYearConstraint $activityYearConstraint,
- ) {
- }
- /**
- * Return the existing Doctrine SQLFilters.
- */
- protected function getFilters(): FilterCollection
- {
- return $this->entityManager->getFilters();
- }
- /**
- * Enable and preconfigure the doctrine sql filters that apply the time constraints.
- */
- public function configureTimeConstraintFilters(int $accessId): void
- {
- /** @var DatetimeFilter $dateTimeFilter */
- $dateTimeFilter = $this->getFilters()->enable('date_time_filter');
- $dateTimeFilter->setAccessId($accessId);
- $dateTimeFilter->setTimeConstraint($this->dateTimeConstraint);
- /** @var ActivityYearFilter $activityYearFilter */
- $activityYearFilter = $this->getFilters()->enable('activity_year_filter');
- $activityYearFilter->setAccessId($accessId);
- $activityYearFilter->setTimeConstraint($this->activityYearConstraint);
- }
- /**
- * Suspends les contraintes de temps. Celles-ci pourront être restorées grâce à la méthode
- * restoreTimeConstraintFilters().
- *
- * @see src/Filter/Doctrine/TimeConstraint/AbstractTimeFilter.php
- */
- public function suspendTimeConstraintFilters(): void
- {
- if ($this->previousTimeConstraintState !== null) {
- throw new \RuntimeException('date_time_filter is already suspended');
- }
- $filters = $this->entityManager->getFilters();
- if (!$filters->isEnabled('date_time_filter')) {
- $this->previousTimeConstraintState = false;
- return;
- }
- /** @var AbstractTimeFilter $filter */
- $filter = $filters->getFilter('date_time_filter');
- $this->previousTimeConstraintState = $filter->isDisabled() === false;
- $filter->setDisabled(true);
- }
- /**
- * Restore les contraintes de temps après qu'elles aient été suspendues au moyen de la
- * méthode suspendTimeConstraintFilters().
- *
- * @see src/Filter/Doctrine/TimeConstraint/AbstractTimeFilter.php
- */
- public function restoreTimeConstraintFilters(): void
- {
- if ($this->previousTimeConstraintState === null) {
- throw new \RuntimeException('date_time_filter has not been suspended, can not be restored');
- }
- $filters = $this->entityManager->getFilters();
- if ($filters->isEnabled('date_time_filter')) {
- /** @var AbstractTimeFilter $filter */
- $filter = $filters->getFilter('date_time_filter');
- $filter->setDisabled($this->previousTimeConstraintState);
- }
- $this->previousTimeConstraintState = null;
- }
- }
|