FieldMetaReader.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. declare(strict_types=1);
  7. namespace Magento\Framework\GraphQlSchemaStitching\GraphQlReader\MetaReader;
  8. use Magento\Framework\GraphQlSchemaStitching\GraphQlReader\MetaReader\TypeMetaWrapperReader;
  9. /**
  10. * Reads fields and possible arguments from a meta field
  11. */
  12. class FieldMetaReader
  13. {
  14. /**
  15. * @var TypeMetaWrapperReader
  16. */
  17. private $typeMetaReader;
  18. /**
  19. * @var DocReader
  20. */
  21. private $docReader;
  22. /**
  23. * @param TypeMetaWrapperReader $typeMetaReader
  24. * @param DocReader $docReader
  25. */
  26. public function __construct(TypeMetaWrapperReader $typeMetaReader, DocReader $docReader)
  27. {
  28. $this->typeMetaReader = $typeMetaReader;
  29. $this->docReader = $docReader;
  30. }
  31. /**
  32. * Read field and possible arguments from a field meta
  33. *
  34. * @param \GraphQL\Type\Definition\FieldDefinition $fieldMeta
  35. * @return array
  36. */
  37. public function read(\GraphQL\Type\Definition\FieldDefinition $fieldMeta) : array
  38. {
  39. $fieldName = $fieldMeta->name;
  40. $fieldTypeMeta = $fieldMeta->getType();
  41. $result = [
  42. 'name' => $fieldName,
  43. 'arguments' => []
  44. ];
  45. $fieldResolver = $this->getFieldResolver($fieldMeta);
  46. if (!empty($fieldResolver)) {
  47. $result['resolver'] = $fieldResolver;
  48. }
  49. $result = array_merge(
  50. $result,
  51. $this->typeMetaReader->read($fieldTypeMeta, TypeMetaWrapperReader::OUTPUT_FIELD_PARAMETER)
  52. );
  53. if ($this->docReader->read($fieldMeta->astNode->directives)) {
  54. $result['description'] = $this->docReader->read($fieldMeta->astNode->directives);
  55. }
  56. $arguments = $fieldMeta->args;
  57. foreach ($arguments as $argumentMeta) {
  58. $argumentName = $argumentMeta->name;
  59. $result['arguments'][$argumentName] = [
  60. 'name' => $argumentName,
  61. ];
  62. if ($argumentMeta->defaultValue !== null) {
  63. $result['arguments'][$argumentName]['defaultValue'] = $argumentMeta->defaultValue;
  64. }
  65. $typeMeta = $argumentMeta->getType();
  66. $result['arguments'][$argumentName] = array_merge(
  67. $result['arguments'][$argumentName],
  68. $this->typeMetaReader->read($typeMeta, TypeMetaWrapperReader::ARGUMENT_PARAMETER)
  69. );
  70. if ($this->docReader->read($argumentMeta->astNode->directives)) {
  71. $result['arguments'][$argumentName]['description'] =
  72. $this->docReader->read($argumentMeta->astNode->directives);
  73. }
  74. }
  75. return $result;
  76. }
  77. /**
  78. * Read resolver if an annotation with the class of the resolver is defined in the meta
  79. *
  80. * @param \GraphQL\Type\Definition\FieldDefinition $fieldMeta
  81. * @return string
  82. */
  83. private function getFieldResolver(\GraphQL\Type\Definition\FieldDefinition $fieldMeta) : string
  84. {
  85. /** @var \GraphQL\Language\AST\NodeList $directives */
  86. $directives = $fieldMeta->astNode->directives;
  87. foreach ($directives as $directive) {
  88. if ($directive->name->value == 'resolver') {
  89. foreach ($directive->arguments as $directiveArgument) {
  90. if ($directiveArgument->name->value == 'class') {
  91. return $directiveArgument->value->value;
  92. }
  93. }
  94. }
  95. }
  96. return '';
  97. }
  98. }