vendor/overblog/graphql-bundle/src/DependencyInjection/Compiler/AliasedPass.php line 49

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Overblog\GraphQLBundle\DependencyInjection\Compiler;
  4. use GraphQL\Type\Definition\Type;
  5. use Overblog\GraphQLBundle\Definition\Resolver\AliasedInterface;
  6. use Overblog\GraphQLBundle\Definition\Resolver\MutationInterface;
  7. use Overblog\GraphQLBundle\Definition\Resolver\QueryInterface;
  8. use Overblog\GraphQLBundle\Definition\Resolver\ResolverInterface;
  9. use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
  10. use Symfony\Component\DependencyInjection\ContainerBuilder;
  11. use Symfony\Component\DependencyInjection\Definition;
  12. use function array_filter;
  13. use function is_subclass_of;
  14. final class AliasedPass implements CompilerPassInterface
  15. {
  16. private const SERVICE_SUBCLASS_TAG_MAPPING = [
  17. MutationInterface::class => 'overblog_graphql.mutation',
  18. QueryInterface::class => 'overblog_graphql.query',
  19. Type::class => TypeTaggedServiceMappingPass::TAG_NAME,
  20. // TODO: remove next line in 1.0
  21. ResolverInterface::class => 'overblog_graphql.resolver',
  22. ];
  23. /**
  24. * {@inheritdoc}
  25. */
  26. public function process(ContainerBuilder $container): void
  27. {
  28. $definitions = $this->filterDefinitions($container->getDefinitions());
  29. foreach ($definitions as $definition) {
  30. $this->addDefinitionTagsFromAliases($definition);
  31. }
  32. }
  33. /**
  34. * @param Definition[] $definitions
  35. *
  36. * @return Definition[]
  37. */
  38. private function filterDefinitions(array $definitions): array
  39. {
  40. return array_filter($definitions, function (Definition $definition) {
  41. // TODO: remove following if-block in 1.0
  42. if ($definition->hasTag('overblog_graphql.resolver')) {
  43. @trigger_error(
  44. "The 'overblog_graphql.resolver' tag is deprecated since 0.14 and will be removed in 1.0. Use 'overblog_graphql.query' instead. For more info visit: https://github.com/overblog/GraphQLBundle/issues/775",
  45. E_USER_DEPRECATED
  46. );
  47. }
  48. foreach (self::SERVICE_SUBCLASS_TAG_MAPPING as $tagName) {
  49. if ($definition->hasTag($tagName)) {
  50. return is_subclass_of($definition->getClass(), AliasedInterface::class);
  51. }
  52. }
  53. return false;
  54. });
  55. }
  56. private function addDefinitionTagsFromAliases(Definition $definition): void
  57. {
  58. /**
  59. * @var class-string<AliasedInterface> $class
  60. */
  61. $class = (string) $definition->getClass();
  62. $aliases = $class::getAliases();
  63. /** @var string $tagName */
  64. $tagName = $this->guessTagName($definition);
  65. $withMethod = TypeTaggedServiceMappingPass::TAG_NAME !== $tagName;
  66. foreach ($aliases as $key => $alias) {
  67. $definition->addTag($tagName, $withMethod ? ['alias' => $alias, 'method' => $key] : ['alias' => $alias]);
  68. }
  69. }
  70. private function guessTagName(Definition $definition): ?string
  71. {
  72. $tagName = null;
  73. foreach (self::SERVICE_SUBCLASS_TAG_MAPPING as $refClassName => $tag) {
  74. if (is_subclass_of($definition->getClass(), $refClassName)) {
  75. $tagName = $tag;
  76. break;
  77. }
  78. }
  79. return $tagName;
  80. }
  81. }