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. }