AbstractExtension.php 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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. /**
  10. * Base class for custom doctrine extensions.
  11. */
  12. abstract class AbstractExtension implements QueryCollectionExtensionInterface, QueryItemExtensionInterface
  13. {
  14. /**
  15. * Called by doctrine when getting a collection.
  16. *
  17. * @param mixed[] $context
  18. *
  19. * @throws \Exception
  20. */
  21. public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, ?Operation $operation = null, array $context = []): void
  22. {
  23. $this->apply($queryBuilder, $resourceClass, $operation);
  24. }
  25. /**
  26. * Called by doctrine when getting an item.
  27. *
  28. * @param list<int> $identifiers
  29. * @param mixed[] $context
  30. *
  31. * @throws \Exception
  32. */
  33. public function applyToItem(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, array $identifiers, ?Operation $operation = null, array $context = []): void
  34. {
  35. $this->apply($queryBuilder, $resourceClass, $operation);
  36. }
  37. /**
  38. * Generic application of the extension.
  39. */
  40. protected function apply(QueryBuilder $queryBuilder, string $resourceClass, ?Operation $operation): void
  41. {
  42. if (!$this->supports($resourceClass, $operation)) {
  43. return;
  44. }
  45. $this->addWhere($queryBuilder, $resourceClass, $operation);
  46. }
  47. /**
  48. * Returns true if the extension supports the given resource.
  49. */
  50. abstract protected function supports(string $resourceClass, ?Operation $operation): bool;
  51. /**
  52. * Add one or more filters to the query.
  53. */
  54. abstract protected function addWhere(QueryBuilder $queryBuilder, string $resourceClass, ?Operation $operation): void;
  55. }