DateTimeFilter.php 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Filter\DoctrineFilter;
  4. use App\Attribute\DateTimeConstraintAware;
  5. use App\Service\Constraint\DateTimeConstraint;
  6. use App\Service\Utils\StringsUtils;
  7. use Doctrine\ORM\Mapping\ClassMetadata;
  8. /**
  9. * Classe DateTimeFilter qui définie la requête SQL devant être ajoutée aux Entités possédant l'annotation DateTimeConstraintAware
  10. */
  11. final class DateTimeFilter extends AbstractTimeFilter
  12. {
  13. private DateTimeConstraint $dateTimeConstraint;
  14. /**
  15. * Méthode surchargée de SQLFilter
  16. * @param ClassMetadata $targetEntity
  17. * @param string $targetTableAlias
  18. * @return string
  19. * @throws \Exception
  20. */
  21. public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias): string
  22. {
  23. if(!$this->hasParameter('_time_constraint')
  24. || !boolval(StringsUtils::unquote($this->getParameter('_time_constraint')))
  25. || !$this->hasParameter('accessId')
  26. )
  27. return '';
  28. $dateTimeConstraintAware = $targetEntity->getReflectionClass()->getAttributes(DateTimeConstraintAware::class)[0] ?? null;
  29. $startFieldName = $dateTimeConstraintAware?->getArguments()['startDateFieldName'] ?? null;
  30. $endFieldName = $dateTimeConstraintAware?->getArguments()['endDateFieldName'] ?? null;
  31. if ($startFieldName === '' || is_null($startFieldName) || $endFieldName === '' || is_null($endFieldName)) {
  32. return '';
  33. }
  34. $accessId = intval(StringsUtils::unquote($this->getParameter('accessId')));
  35. $constraints = $this->dateTimeConstraint->invoke($accessId);
  36. $fields = [
  37. DateTimeConstraint::START_KEY => $startFieldName,
  38. DateTimeConstraint::END_KEY => $endFieldName
  39. ];
  40. return $this->constructQuery($constraints, $targetTableAlias, $fields);
  41. }
  42. /**
  43. * Permets d'assurer l'injection de dépendance du service DateTimeConstraint
  44. * @param DateTimeConstraint $dateTimeConstraint
  45. */
  46. public function setDateTimeConstraint(DateTimeConstraint $dateTimeConstraint){
  47. $this->dateTimeConstraint = $dateTimeConstraint;
  48. }
  49. }