src/DataFilter/OrderRequestStateDataFilter.php line 19

Open in your IDE?
  1. <?php
  2. namespace App\DataFilter;
  3. use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\AbstractContextAwareFilter;
  4. use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGeneratorInterface;
  5. use App\Request\OrderRequestRequest;
  6. use App\Service\OrderRequestStateHandler;
  7. use Doctrine\ORM\QueryBuilder;
  8. class OrderRequestStateDataFilter extends AbstractContextAwareFilter
  9. {
  10. /**
  11. * @inheritDoc
  12. */
  13. protected function filterProperty(
  14. string $property,
  15. $value,
  16. QueryBuilder $queryBuilder,
  17. QueryNameGeneratorInterface $queryNameGenerator,
  18. string $resourceClass,
  19. string $operationName = null
  20. ) {
  21. if ($property !== 'state') {
  22. return;
  23. }
  24. if ($resourceClass !== OrderRequestRequest::class) {
  25. return;
  26. }
  27. $value = $this->normalizeValue($value);
  28. if ($value === null) {
  29. return;
  30. }
  31. $parameterName = $queryNameGenerator->generateParameterName($property);
  32. $where = sprintf('p.state = :%s', $parameterName);
  33. if (is_array($value)) {
  34. $where = sprintf('p.state IN (:%s)', $parameterName);
  35. }
  36. $queryBuilder
  37. ->andWhere($where)
  38. ->setParameter($parameterName, $value);
  39. }
  40. private function normalizeValue($value)
  41. {
  42. $value = strtolower($value);
  43. if (strpos($value, '|') !== false) {
  44. $value = explode('|', $value);
  45. }
  46. if (is_array($value)) {
  47. return array_filter(
  48. array_map([$this, 'normalizeValue'], $value),
  49. function ($value) {
  50. return $value !== null;
  51. }
  52. );
  53. }
  54. if (!in_array($value, OrderRequestStateHandler::getStates())) {
  55. return null;
  56. }
  57. return $value;
  58. }
  59. /**
  60. * @inheritDoc
  61. */
  62. public function getDescription(string $resourceClass): array
  63. {
  64. $description = [
  65. 'state' => [
  66. 'property' => 'state',
  67. 'type' => 'string',
  68. 'required' => false,
  69. 'schema' => [
  70. 'type' => 'string',
  71. 'description' => 'Filters by the given state, you can use Pipe symbol for multiple states',
  72. 'enum' => OrderRequestStateHandler::getStates(),
  73. ],
  74. ],
  75. ];
  76. return $description;
  77. }
  78. }