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

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 call_user_func;
  14. use function is_subclass_of;
  15. final class AliasedPass implements CompilerPassInterface
  16. {
  17.     private const SERVICE_SUBCLASS_TAG_MAPPING = [
  18.         MutationInterface::class => 'overblog_graphql.mutation',
  19.         QueryInterface::class => 'overblog_graphql.query',
  20.         Type::class => TypeTaggedServiceMappingPass::TAG_NAME,
  21.         // TODO: remove next line in 1.0
  22.         ResolverInterface::class => 'overblog_graphql.resolver',
  23.     ];
  24.     /**
  25.      * {@inheritdoc}
  26.      */
  27.     public function process(ContainerBuilder $container): void
  28.     {
  29.         $definitions $this->filterDefinitions($container->getDefinitions());
  30.         foreach ($definitions as $definition) {
  31.             $this->addDefinitionTagsFromAliases($definition);
  32.         }
  33.     }
  34.     /**
  35.      * @param Definition[] $definitions
  36.      *
  37.      * @return Definition[]
  38.      */
  39.     private function filterDefinitions(array $definitions): array
  40.     {
  41.         return array_filter($definitions, function (Definition $definition) {
  42.             // TODO: remove following if-block in 1.0
  43.             if ($definition->hasTag('overblog_graphql.resolver')) {
  44.                 @trigger_error(
  45.                     "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",
  46.                     E_USER_DEPRECATED
  47.                 );
  48.             }
  49.             foreach (self::SERVICE_SUBCLASS_TAG_MAPPING as $tagName) {
  50.                 if ($definition->hasTag($tagName)) {
  51.                     return is_subclass_of($definition->getClass(), AliasedInterface::class);
  52.                 }
  53.             }
  54.             return false;
  55.         });
  56.     }
  57.     private function addDefinitionTagsFromAliases(Definition $definition): void
  58.     {
  59.         $aliases call_user_func([$definition->getClass(), 'getAliases']);
  60.         /** @var string $tagName */
  61.         $tagName $this->guessTagName($definition);
  62.         $withMethod TypeTaggedServiceMappingPass::TAG_NAME !== $tagName;
  63.         foreach ($aliases as $key => $alias) {
  64.             $definition->addTag($tagName$withMethod ? ['alias' => $alias'method' => $key] : ['alias' => $alias]);
  65.         }
  66.     }
  67.     private function guessTagName(Definition $definition): ?string
  68.     {
  69.         $tagName null;
  70.         foreach (self::SERVICE_SUBCLASS_TAG_MAPPING as $refClassName => $tag) {
  71.             if (is_subclass_of($definition->getClass(), $refClassName)) {
  72.                 $tagName $tag;
  73.                 break;
  74.             }
  75.         }
  76.         return $tagName;
  77.     }
  78. }