EnumDataProvider.php 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\DataProvider\Enum;
  4. use ApiPlatform\Core\DataProvider\ItemDataProviderInterface;
  5. use ApiPlatform\Core\DataProvider\RestrictedDataProviderInterface;
  6. use App\ApiResources\Enum\Enum;
  7. use App\Service\Utils\Parser;
  8. use App\Service\Utils\Reflection;
  9. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  10. /**
  11. * Class EnumDataProvider : custom provider pour assurer l'alimentation des enums
  12. * @package App\DataProvider\Access
  13. */
  14. final class EnumDataProvider implements ItemDataProviderInterface, RestrictedDataProviderInterface
  15. {
  16. public function __construct(
  17. private Parser $parser,
  18. private string $opentalentConfig,
  19. private Reflection $reflection
  20. )
  21. { }
  22. public function supports(string $resourceClass, string $operationName = null, array $context = []): bool
  23. {
  24. return Enum::class === $resourceClass;
  25. }
  26. public function getItem(string $resourceClass, $id, string $operationName = null, array $context = []): ?Enum
  27. {
  28. $enums = $this->parser->yamlParser($this->opentalentConfig, 'enum.yaml');
  29. $enumClass = $enums['opentalent'][$id];
  30. if(!$enumClass)
  31. throw new NotFoundHttpException(sprintf('Enum %s does\'nt exist', $id));
  32. try{
  33. $items = $this->reflection->dynamicInvokeClassWithArgsAndMethod(
  34. $enumClass,
  35. 'toArray'
  36. );
  37. }catch (\Exception $exception){
  38. throw new NotFoundHttpException(sprintf('Enum %s does\'nt exist', $id));
  39. }
  40. $enumResponse = new Enum();
  41. $enumResponse->setName($id);
  42. $enumResponse->setItems($items);
  43. return $enumResponse;
  44. }
  45. }