AbstractExtension.php 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Doctrine;
  4. use ApiPlatform\Doctrine\Orm\Extension\QueryCollectionExtensionInterface;
  5. use ApiPlatform\Doctrine\Orm\Extension\QueryItemExtensionInterface;
  6. use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface;
  7. use ApiPlatform\Metadata\Operation;
  8. use Doctrine\ORM\QueryBuilder;
  9. use Exception;
  10. /**
  11. * Base class for custom doctrine extensions
  12. */
  13. abstract class AbstractExtension implements QueryCollectionExtensionInterface, QueryItemExtensionInterface
  14. {
  15. /**
  16. * Called by doctrine when getting a collection
  17. *
  18. * @param QueryBuilder $queryBuilder
  19. * @param QueryNameGeneratorInterface $queryNameGenerator
  20. * @param string $resourceClass
  21. * @param Operation|null $operation
  22. * @param mixed[] $context
  23. * @return void
  24. * @throws Exception
  25. */
  26. public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, Operation $operation = null, array $context = []): void
  27. {
  28. $this->apply($queryBuilder, $resourceClass, $operation);
  29. }
  30. /**
  31. * Called by doctrine when getting an item
  32. *
  33. * @param QueryBuilder $queryBuilder
  34. * @param QueryNameGeneratorInterface $queryNameGenerator
  35. * @param string $resourceClass
  36. * @param list<int> $identifiers
  37. * @param Operation|null $operation
  38. * @param mixed[] $context
  39. * @return void
  40. * @throws Exception
  41. */
  42. public function applyToItem(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, array $identifiers, Operation $operation = null, array $context = []): void
  43. {
  44. $this->apply($queryBuilder, $resourceClass, $operation);
  45. }
  46. /**
  47. * Generic application of the extension
  48. *
  49. * @param $queryBuilder
  50. * @param $resourceClass
  51. * @return void
  52. */
  53. protected function apply(QueryBuilder $queryBuilder, string $resourceClass, ?Operation $operation): void {
  54. if (!$this->supports($resourceClass, $operation)) {
  55. return;
  56. }
  57. $this->addWhere($queryBuilder, $resourceClass, $operation);
  58. }
  59. /**
  60. * Returns true if the extension supports the given resource
  61. *
  62. * @param string $resourceClass
  63. * @return bool
  64. */
  65. abstract protected function supports(string $resourceClass, ?Operation $operation): bool;
  66. /**
  67. * Add one or more filters to the query
  68. *
  69. * @param QueryBuilder $queryBuilder
  70. * @param string $resourceClass
  71. * @return void
  72. */
  73. abstract protected function addWhere(QueryBuilder $queryBuilder, string $resourceClass, ?Operation $operation): void;
  74. }