src/DataFilter/OrderRequestOrderDataFilter.php line 52

Open in your IDE?
  1. <?php
  2. namespace App\DataFilter;
  3. use ApiPlatform\Core\Bridge\Doctrine\Common\Filter\OrderFilterInterface;
  4. use ApiPlatform\Core\Bridge\Doctrine\Common\Filter\OrderFilterTrait;
  5. use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\AbstractContextAwareFilter;
  6. use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGeneratorInterface;
  7. use App\Request\OrderRequestRequest;
  8. use Doctrine\ORM\QueryBuilder;
  9. use Doctrine\Persistence\ManagerRegistry;
  10. use Psr\Log\LoggerInterface;
  11. use Symfony\Component\HttpFoundation\RequestStack;
  12. use Symfony\Component\Serializer\NameConverter\NameConverterInterface;
  13. class OrderRequestOrderDataFilter extends AbstractContextAwareFilter implements OrderFilterInterface
  14. {
  15. use OrderFilterTrait;
  16. public function __construct(
  17. ManagerRegistry $managerRegistry,
  18. ?RequestStack $requestStack = null,
  19. string $orderParameterName = 'order',
  20. LoggerInterface $logger = null,
  21. array $properties = null,
  22. NameConverterInterface $nameConverter = null
  23. ) {
  24. parent::__construct($managerRegistry, $requestStack, $logger, $properties, $nameConverter);
  25. $this->orderParameterName = $orderParameterName;
  26. }
  27. protected function getProperties(): ?array
  28. {
  29. return [
  30. 'createdAt' => ['default_direction' => strtolower(self::DIRECTION_DESC)],
  31. 'updatedAt' => ['default_direction' => strtolower(self::DIRECTION_DESC)],
  32. ];
  33. }
  34. protected function isPropertyMapped(string $property, string $resourceClass, bool $allowAssociation = false): bool
  35. {
  36. return in_array($property, array_keys($this->getProperties()));
  37. }
  38. /**
  39. * @inheritDoc
  40. */
  41. protected function filterProperty(
  42. string $property,
  43. $value,
  44. QueryBuilder $queryBuilder,
  45. QueryNameGeneratorInterface $queryNameGenerator,
  46. string $resourceClass,
  47. string $operationName = null
  48. ) {
  49. if ($property !== $this->orderParameterName) {
  50. return;
  51. }
  52. if ($resourceClass !== OrderRequestRequest::class) {
  53. return;
  54. }
  55. $properties = array_keys($this->getProperties());
  56. foreach ($value as $property => $direction) {
  57. if (!in_array($property, $properties)) {
  58. continue;
  59. }
  60. $direction = $this->normalizeValue($direction, $property);
  61. if ($direction === null) {
  62. continue;
  63. }
  64. $queryBuilder->addOrderBy(sprintf('p.%s', $property), $direction);
  65. }
  66. }
  67. }