diff --git a/Command/DebugCommand.php b/Command/DebugCommand.php
index 2e84016ba..d379a3bd5 100644
--- a/Command/DebugCommand.php
+++ b/Command/DebugCommand.php
@@ -53,12 +53,6 @@ protected function configure()
InputOption::VALUE_IS_ARRAY | InputOption::VALUE_OPTIONAL,
sprintf('filter by a category (%s).', implode(', ', self::$categories))
)
- ->addOption(
- 'with-service-id',
- null,
- InputOption::VALUE_NONE,
- 'also display service id'
- )
->setDescription('Display current GraphQL services (types, resolvers and mutations)');
}
@@ -72,20 +66,16 @@ protected function execute(InputInterface $input, OutputInterface $output)
}
$categories = empty($categoriesOption) ? self::$categories : $categoriesOption;
- $withServiceId = $input->getOption('with-service-id');
$io = new SymfonyStyle($input, $output);
$tableHeaders = ['solution id', 'aliases'];
- if ($withServiceId) {
- $tableHeaders[] = 'service id';
- }
foreach ($categories as $category) {
$io->title(sprintf('GraphQL %ss Services', ucfirst($category)));
/** @var FluentResolverInterface $resolver */
$resolver = $this->{$category.'Resolver'};
- $this->renderTable($resolver, $tableHeaders, $io, $withServiceId);
+ $this->renderTable($resolver, $tableHeaders, $io);
}
}
@@ -93,32 +83,24 @@ protected function execute(InputInterface $input, OutputInterface $output)
* @param FluentResolverInterface $resolver
* @param array $tableHeaders
* @param SymfonyStyle $io
- * @param bool $withServiceId
*/
- private function renderTable(FluentResolverInterface $resolver, array $tableHeaders, SymfonyStyle $io, $withServiceId)
+ private function renderTable(FluentResolverInterface $resolver, array $tableHeaders, SymfonyStyle $io)
{
$tableRows = [];
$solutionIDs = array_keys($resolver->getSolutions());
sort($solutionIDs);
foreach ($solutionIDs as $solutionID) {
$aliases = $resolver->getSolutionAliases($solutionID);
- $options = $resolver->getSolutionOptions($solutionID);
- $tableRows[$solutionID] = [$solutionID, self::serializeAliases($aliases, $options)];
- if ($withServiceId) {
- $tableRows[$solutionID][] = $options['id'];
- }
+ $tableRows[$solutionID] = [$solutionID, self::serializeAliases($aliases)];
}
ksort($tableRows);
$io->table($tableHeaders, $tableRows);
$io->write("\n\n");
}
- private static function serializeAliases(array $aliases, array $options)
+ private static function serializeAliases(array $aliases)
{
ksort($aliases);
- $aliases = array_map(function ($alias) use ($options) {
- return $alias.(isset($options['method']) ? ' (method: '.$options['method'].')' : '');
- }, $aliases);
return implode("\n", $aliases);
}
diff --git a/Config/TypeDefinition.php b/Config/TypeDefinition.php
index 6a977fd19..2add640f0 100644
--- a/Config/TypeDefinition.php
+++ b/Config/TypeDefinition.php
@@ -37,7 +37,7 @@ protected function nameSection()
->ifTrue(function ($name) {
return !preg_match('/^[_a-z][_0-9a-z]*$/i', $name);
})
- ->thenInvalid('Invalid type name "%s". (see http://facebook.github.io/graphql/October2016/#Name)')
+ ->thenInvalid('Invalid type name "%s". (see https://facebook.github.io/graphql/October2016/#Name)')
->end();
return $node;
diff --git a/DependencyInjection/Compiler/TaggedServiceMappingPass.php b/DependencyInjection/Compiler/TaggedServiceMappingPass.php
index f2fd5e3c4..3f88e25a2 100644
--- a/DependencyInjection/Compiler/TaggedServiceMappingPass.php
+++ b/DependencyInjection/Compiler/TaggedServiceMappingPass.php
@@ -18,14 +18,13 @@ private function getTaggedServiceMapping(ContainerBuilder $container, $tagName)
$isType = TypeTaggedServiceMappingPass::TAG_NAME === $tagName;
foreach ($taggedServices as $id => $tags) {
- $className = $container->findDefinition($id)->getClass();
foreach ($tags as $attributes) {
$this->checkRequirements($id, $attributes);
$attributes = self::resolveAttributes($attributes, $id, !$isType);
- $solutionID = $className;
+ $solutionID = $id;
if (!$isType && '__invoke' !== $attributes['method']) {
- $solutionID = sprintf('%s::%s', $className, $attributes['method']);
+ $solutionID = sprintf('%s::%s', $id, $attributes['method']);
}
if (!isset($serviceMapping[$solutionID])) {
diff --git a/Relay/Mutation/MutationFieldDefinition.php b/Relay/Mutation/MutationFieldDefinition.php
index 0ac4bf192..d01f83e6b 100644
--- a/Relay/Mutation/MutationFieldDefinition.php
+++ b/Relay/Mutation/MutationFieldDefinition.php
@@ -3,7 +3,6 @@
namespace Overblog\GraphQLBundle\Relay\Mutation;
use Overblog\GraphQLBundle\Definition\Builder\MappingInterface;
-use Overblog\GraphQLBundle\GraphQL\Relay\Mutation\MutationFieldResolver;
final class MutationFieldDefinition implements MappingInterface
{
@@ -16,14 +15,13 @@ public function toMappingDefinition(array $config)
$mutateAndGetPayload = $this->cleanMutateAndGetPayload($config['mutateAndGetPayload']);
$payloadType = isset($config['payloadType']) && is_string($config['payloadType']) ? $config['payloadType'] : null;
$inputType = isset($config['inputType']) && is_string($config['inputType']) ? $config['inputType'].'!' : null;
- $resolver = addslashes(MutationFieldResolver::class);
return [
'type' => $payloadType,
'args' => [
'input' => ['type' => $inputType],
],
- 'resolve' => "@=resolver('$resolver', [args, context, info, mutateAndGetPayloadCallback($mutateAndGetPayload)])",
+ 'resolve' => "@=resolver('relay_mutation_field', [args, context, info, mutateAndGetPayloadCallback($mutateAndGetPayload)])",
];
}
diff --git a/Relay/Node/GlobalIdFieldDefinition.php b/Relay/Node/GlobalIdFieldDefinition.php
index fe5ee5470..95d2bb5bc 100644
--- a/Relay/Node/GlobalIdFieldDefinition.php
+++ b/Relay/Node/GlobalIdFieldDefinition.php
@@ -3,7 +3,6 @@
namespace Overblog\GraphQLBundle\Relay\Node;
use Overblog\GraphQLBundle\Definition\Builder\MappingInterface;
-use Overblog\GraphQLBundle\GraphQL\Relay\Node\GlobalIdFieldResolver;
final class GlobalIdFieldDefinition implements MappingInterface
{
@@ -11,12 +10,11 @@ public function toMappingDefinition(array $config)
{
$typeName = isset($config['typeName']) && is_string($config['typeName']) ? var_export($config['typeName'], true) : 'null';
$idFetcher = isset($config['idFetcher']) && is_string($config['idFetcher']) ? $this->cleanIdFetcher($config['idFetcher']) : 'null';
- $resolver = addslashes(GlobalIdFieldResolver::class);
return [
'description' => 'The ID of an object',
'type' => 'ID!',
- 'resolve' => "@=resolver('$resolver', [value, info, $idFetcher, $typeName])",
+ 'resolve' => "@=resolver('relay_globalid_field', [value, info, $idFetcher, $typeName])",
];
}
diff --git a/Relay/Node/NodeFieldDefinition.php b/Relay/Node/NodeFieldDefinition.php
index cc17d195a..029bd2ef4 100644
--- a/Relay/Node/NodeFieldDefinition.php
+++ b/Relay/Node/NodeFieldDefinition.php
@@ -3,7 +3,6 @@
namespace Overblog\GraphQLBundle\Relay\Node;
use Overblog\GraphQLBundle\Definition\Builder\MappingInterface;
-use Overblog\GraphQLBundle\GraphQL\Relay\Node\NodeFieldResolver;
final class NodeFieldDefinition implements MappingInterface
{
@@ -15,7 +14,6 @@ public function toMappingDefinition(array $config)
$idFetcher = $this->cleanIdFetcher($config['idFetcher']);
$nodeInterfaceType = isset($config['nodeInterfaceType']) && is_string($config['nodeInterfaceType']) ? $config['nodeInterfaceType'] : null;
- $resolver = addslashes(NodeFieldResolver::class);
return [
'description' => 'Fetches an object given its ID',
@@ -23,7 +21,7 @@ public function toMappingDefinition(array $config)
'args' => [
'id' => ['type' => 'ID!', 'description' => 'The ID of an object'],
],
- 'resolve' => "@=resolver('$resolver', [args, context, info, idFetcherCallback($idFetcher)])",
+ 'resolve' => "@=resolver('relay_node_field', [args, context, info, idFetcherCallback($idFetcher)])",
];
}
diff --git a/Relay/Node/PluralIdentifyingRootFieldDefinition.php b/Relay/Node/PluralIdentifyingRootFieldDefinition.php
index 292bd76f3..3a666a0d7 100644
--- a/Relay/Node/PluralIdentifyingRootFieldDefinition.php
+++ b/Relay/Node/PluralIdentifyingRootFieldDefinition.php
@@ -3,7 +3,6 @@
namespace Overblog\GraphQLBundle\Relay\Node;
use Overblog\GraphQLBundle\Definition\Builder\MappingInterface;
-use Overblog\GraphQLBundle\GraphQL\Relay\Node\PluralIdentifyingRootFieldResolver;
final class PluralIdentifyingRootFieldDefinition implements MappingInterface
{
@@ -26,14 +25,12 @@ public function toMappingDefinition(array $config)
}
$argName = $config['argName'];
- $resolver = addslashes(PluralIdentifyingRootFieldResolver::class);
return [
'type' => "[${config['outputType']}]",
'args' => [$argName => ['type' => "[${config['inputType']}!]!"]],
'resolve' => sprintf(
- "@=resolver('%s', [args['$argName'], context, info, resolveSingleInputCallback(%s)])",
- $resolver,
+ "@=resolver('relay_plural_identifying_field', [args['$argName'], context, info, resolveSingleInputCallback(%s)])",
$this->cleanResolveSingleInput($config['resolveSingleInput'])
),
];
diff --git a/Resolver/AbstractResolver.php b/Resolver/AbstractResolver.php
index 1e11281e7..0442cebcf 100644
--- a/Resolver/AbstractResolver.php
+++ b/Resolver/AbstractResolver.php
@@ -2,6 +2,8 @@
namespace Overblog\GraphQLBundle\Resolver;
+use Symfony\Component\HttpKernel\Kernel;
+
abstract class AbstractResolver implements FluentResolverInterface
{
/** @var array */
@@ -15,8 +17,17 @@ abstract class AbstractResolver implements FluentResolverInterface
/** @var array */
private $fullyLoadedSolutions = [];
+ /** @var bool */
+ private $ignoreCase = true;
+
+ public function __construct()
+ {
+ $this->ignoreCase = version_compare(Kernel::VERSION, '3.3.0') < 0;
+ }
+
public function addSolution($id, $solutionOrFactory, array $aliases = [], array $options = [])
{
+ $id = $this->cleanIdOrAlias($id);
$this->fullyLoadedSolutions[$id] = false;
$this->addAliases($id, $aliases);
@@ -105,7 +116,7 @@ private function loadSolution($id)
private function addAliases($id, $aliases)
{
foreach ($aliases as $alias) {
- $this->aliases[$alias] = $id;
+ $this->aliases[$this->cleanIdOrAlias($alias)] = $id;
}
}
@@ -116,9 +127,16 @@ private static function isSolutionFactory($solutionOrFactory)
private function resolveAlias($alias)
{
+ $alias = $this->cleanIdOrAlias($alias);
+
return isset($this->aliases[$alias]) ? $this->aliases[$alias] : $alias;
}
+ private function cleanIdOrAlias($idOrAlias)
+ {
+ return $this->ignoreCase ? strtolower($idOrAlias) : $idOrAlias;
+ }
+
/**
* @return mixed[]
*/
diff --git a/Resolver/TypeResolver.php b/Resolver/TypeResolver.php
index a85957b0a..6ecaa5ae9 100644
--- a/Resolver/TypeResolver.php
+++ b/Resolver/TypeResolver.php
@@ -3,18 +3,10 @@
namespace Overblog\GraphQLBundle\Resolver;
use GraphQL\Type\Definition\Type;
-use Psr\Cache\CacheItemPoolInterface;
-use Symfony\Component\Cache\Adapter\ArrayAdapter;
class TypeResolver extends AbstractResolver
{
- /** @var CacheItemPoolInterface */
- private $cacheAdapter;
-
- public function __construct(CacheItemPoolInterface $cacheAdapter = null)
- {
- $this->cacheAdapter = null !== $cacheAdapter ? $cacheAdapter : new ArrayAdapter(0, false);
- }
+ private $cache = [];
/**
* @param string $alias
@@ -26,15 +18,13 @@ public function resolve($alias)
if (null === $alias) {
return;
}
- $item = $this->cacheAdapter->getItem(md5($alias));
- if (!$item->isHit()) {
+ if (!isset($this->cache[$alias])) {
$type = $this->string2Type($alias);
- $item->set($type);
- $this->cacheAdapter->save($item);
+ $this->cache[$alias] = $type;
}
- return $item->get();
+ return $this->cache[$alias];
}
private function string2Type($alias)
diff --git a/Resources/config/services.yml b/Resources/config/services.yml
index cb1902ecf..e8e1d307f 100644
--- a/Resources/config/services.yml
+++ b/Resources/config/services.yml
@@ -38,8 +38,6 @@ services:
overblog_graphql.type_resolver:
class: Overblog\GraphQLBundle\Resolver\TypeResolver
public: true
- arguments:
- -
tags:
- { name: overblog_graphql.global_variable, alias: typeResolver }
diff --git a/Resources/doc/definitions/resolver.md b/Resources/doc/definitions/resolver.md
index 70a0b6113..d926ebde4 100644
--- a/Resources/doc/definitions/resolver.md
+++ b/Resources/doc/definitions/resolver.md
@@ -15,8 +15,9 @@ Resolvers can be define 2 different ways
or `Overblog\GraphQLBundle\Definition\Resolver\MutationInterface`)
in `src/*Bundle/GraphQL` or `app/GraphQL` and they will be auto discovered.
Auto map classes method are accessible by:
- * the class method name (example: `AppBunble\GraphQL\CustomResolver::myMethod`)
- * the FQCN for callable classes (example: `AppBunble\GraphQL\InvokeResolver` for a resolver implementing the `__invoke` method)
+ * double-colon (::) to separate service id (class name) and the method names
+ (example: `AppBunble\GraphQL\CustomResolver::myMethod`)
+ * for callable classes you can use the service id (example: `AppBunble\GraphQL\InvokeResolver` for a resolver implementing the `__invoke` method)
you can also alias a type by implementing `Overblog\GraphQLBundle\Definition\Resolver\AliasedInterface`
which returns a map of method/alias. The service created will autowire the `__construct`
and `Symfony\Component\DependencyInjection\ContainerAwareInterface::setContainer` methods.
@@ -133,7 +134,7 @@ Resolvers can be define 2 different ways
```
**Note:**
- * When using FQCN in yaml definition, backslash must be correctly quotes,
+ * When using service id as FQCN in yaml definition, backslashes must be correctly escaped,
here an example `'@=resolver("App\\GraphQL\\Resolver\\Greetings", [args['name']])'`.
* You can also see the more straight forward way using [resolver map](resolver-map.md)
@@ -151,7 +152,7 @@ Resolvers can be define 2 different ways
#class: App\GraphQL\Resolver\Greetings
tags:
- { name: overblog_graphql.resolver, method: sayHello, alias: say_hello } # add alias say_hello
- - { name: overblog_graphql.resolver, method: sayHello } # add method full qualified name
+ - { name: overblog_graphql.resolver, method: sayHello } # add service id "App\GraphQL\Resolver\Greetings"
```
`SayHello` resolver can be access by using `App\GraphQL\Resolver\Greetings::sayHello` or
@@ -168,7 +169,7 @@ Resolvers can be define 2 different ways
- { name: overblog_graphql.resolver }
```
- This way resolver can be accessed with FQCN `App\GraphQL\Resolver\Greetings`.
+ This way resolver can be accessed with service id `App\GraphQL\Resolver\Greetings`.
for mutation:
diff --git a/Resources/doc/definitions/type-system/index.md b/Resources/doc/definitions/type-system/index.md
index 08cd8a7da..c6bf02263 100644
--- a/Resources/doc/definitions/type-system/index.md
+++ b/Resources/doc/definitions/type-system/index.md
@@ -40,7 +40,7 @@ Types can be define 3 different ways:
You can also declare PHP types (any subclass of `GraphQL\Type\Definition\Type`)
in `src/*Bundle/GraphQL` or `app/GraphQL`
- they will be auto discover (thanks to auto mapping). Auto map classes are accessible by FQCN
+ they will be auto discover (thanks to auto mapping). Auto map classes are accessible by service id
(example: `AppBunble\GraphQL\Type\DateTimeType`), you can also alias a type by
implementing `Overblog\GraphQLBundle\Definition\Resolver\AliasedInterface`
that returns an array of aliases.
@@ -102,7 +102,7 @@ Types can be define 3 different ways:
**Note:**
* Types are lazy loaded so when using Symfony DI `autoconfigure` or this bundle auto mapping, the
only access to type is FQCN (or aliases if implements the aliases interface).
- * When using FQCN in yaml definition, backslash must be correctly quotes,
+ * When using service id as FQCN in yaml definition, backslashes must be correctly escaped,
3. **The service way**
diff --git a/Tests/Functional/App/GraphQL/HelloWord/Type/QueryType.php b/Tests/Functional/App/GraphQL/HelloWord/Type/QueryType.php
index 72224176d..26e8008d7 100644
--- a/Tests/Functional/App/GraphQL/HelloWord/Type/QueryType.php
+++ b/Tests/Functional/App/GraphQL/HelloWord/Type/QueryType.php
@@ -21,10 +21,7 @@ public function __construct(ResolverResolver $resolver)
'message' => ['type' => Type::string()],
],
'resolve' => function ($root, $args) use ($resolver) {
- return $resolver->resolve([
- EchoResolver::class,
- [$args['message']],
- ]);
+ return $resolver->resolve([EchoResolver::class, [$args['message']]]);
},
],
],
diff --git a/Tests/Functional/App/config/autoMapping/config.yml b/Tests/Functional/App/config/autoMapping/config.yml
index 776add1d1..832656bfa 100644
--- a/Tests/Functional/App/config/autoMapping/config.yml
+++ b/Tests/Functional/App/config/autoMapping/config.yml
@@ -9,5 +9,5 @@ overblog_graphql:
enabled: true
directories: ["%kernel.root_dir%/IsolatedResolver"]
schema:
- query: "Overblog\\GraphQLBundle\\Tests\\Functional\\App\\GraphQL\\HelloWord\\Type\\QueryType"
- mutation: "Overblog\\GraphQLBundle\\Tests\\Functional\\App\\GraphQL\\HelloWord\\Type\\MutationType"
+ query: "Query"
+ mutation: "Calc"
diff --git a/Tests/Functional/App/config/node/config.yml b/Tests/Functional/App/config/node/config.yml
index f4c1ac422..677da302d 100644
--- a/Tests/Functional/App/config/node/config.yml
+++ b/Tests/Functional/App/config/node/config.yml
@@ -2,7 +2,7 @@ imports:
- { resource: ../config.yml }
services:
- overblog_graphql.test.resolver.node:
+ node_resolver:
class: Overblog\GraphQLBundle\Tests\Functional\App\Resolver\NodeResolver
arguments:
- "@overblog_graphql.type_resolver"
diff --git a/Tests/Functional/App/config/node/mapping/node_type.yml b/Tests/Functional/App/config/node/mapping/node_type.yml
index e5726aebd..fa5aee5ce 100644
--- a/Tests/Functional/App/config/node/mapping/node_type.yml
+++ b/Tests/Functional/App/config/node/mapping/node_type.yml
@@ -1,4 +1,4 @@
Node:
type: relay-node
config:
- resolveType: '@=resolver("Overblog\\GraphQLBundle\\Tests\\Functional\\App\\Resolver\\NodeResolver::typeResolver", [value])'
+ resolveType: '@=resolver("node_resolver::typeResolver", [value])'
diff --git a/Tests/Functional/App/config/plural/config.yml b/Tests/Functional/App/config/plural/config.yml
index b27b065ef..dbc937039 100644
--- a/Tests/Functional/App/config/plural/config.yml
+++ b/Tests/Functional/App/config/plural/config.yml
@@ -2,7 +2,7 @@ imports:
- { resource: ../config.yml }
services:
- overblog_graphql.test.resolver.plural:
+ plural_resolver:
class: Overblog\GraphQLBundle\Tests\Functional\App\Resolver\PluralResolver
tags:
- { name: "overblog_graphql.resolver" }
diff --git a/Tests/Functional/App/config/plural/mapping/Query.types.xml b/Tests/Functional/App/config/plural/mapping/Query.types.xml
index 42e488ecf..99598ed88 100644
--- a/Tests/Functional/App/config/plural/mapping/Query.types.xml
+++ b/Tests/Functional/App/config/plural/mapping/Query.types.xml
@@ -15,7 +15,7 @@
Map from a username to the user
String
User
- @=resolver("Overblog\\GraphQLBundle\\Tests\\Functional\\App\\Resolver\\PluralResolver", [value, info])
+ @=resolver("plural_resolver", [value, info])
diff --git a/Tests/Functional/Command/DebugCommandTest.php b/Tests/Functional/Command/DebugCommandTest.php
index 796b4dca6..81fe0cc90 100644
--- a/Tests/Functional/Command/DebugCommandTest.php
+++ b/Tests/Functional/Command/DebugCommandTest.php
@@ -26,10 +26,7 @@ public function setUp()
$this->command = static::$kernel->getContainer()->get('overblog_graphql.command.debug');
$this->commandTester = new CommandTester($this->command);
- $categories = DebugCommand::getCategories();
- $categories[] = 'all';
-
- foreach ($categories as $category) {
+ foreach (DebugCommand::getCategories() as $category) {
$content = file_get_contents(
sprintf(
__DIR__.'/fixtures/debug/debug-%s.txt',
@@ -37,7 +34,7 @@ public function setUp()
)
);
- $this->logs[$category] = 'all' === $category ? $content : trim($content);
+ $this->logs[$category] = trim($content);
}
}
@@ -59,18 +56,7 @@ public function testProcess(array $categories)
$expected .= $this->logs[$category]." \n\n\n\n";
}
- $this->assertEquals($expected, $this->commandTester->getDisplay());
- }
-
- public function testProcessWithServiceId()
- {
- if (version_compare(Kernel::VERSION, '3.3.0') < 0) {
- $this->markTestSkipped('Test only for Symfony >= 3.3.0.');
- }
-
- $this->commandTester->execute(['--with-service-id' => null]);
- $this->assertEquals(0, $this->commandTester->getStatusCode());
- $this->assertEquals($this->logs['all'], $this->commandTester->getDisplay());
+ $this->assertContains($expected, $this->commandTester->getDisplay(), '', version_compare(Kernel::VERSION, '3.3.0') < 0);
}
/**
diff --git a/Tests/Functional/Command/fixtures/debug/debug-all.txt b/Tests/Functional/Command/fixtures/debug/debug-all.txt
deleted file mode 100644
index 3e6f08d5c..000000000
--- a/Tests/Functional/Command/fixtures/debug/debug-all.txt
+++ /dev/null
@@ -1,50 +0,0 @@
-
-GraphQL Types Services
-======================
-
- ------------------------------------------------------------------------------------------ -------------------------------------- ------------------------------------------------------------------------------------------
- solution id aliases service id
- ------------------------------------------------------------------------------------------ -------------------------------------- ------------------------------------------------------------------------------------------
- GraphQL\Type\Definition\BooleanType Boolean overblog_graphql.definition.boolean_type
- GraphQL\Type\Definition\FloatType Float overblog_graphql.definition.float_type
- GraphQL\Type\Definition\IDType ID overblog_graphql.definition.id_type
- GraphQL\Type\Definition\IntType Int overblog_graphql.definition.int_type
- GraphQL\Type\Definition\StringType String overblog_graphql.definition.string_type
- Overblog\GraphQLBundle\Mutation\__DEFINITIONS__\PageInfoType PageInfo Overblog\GraphQLBundle\Mutation\__DEFINITIONS__\PageInfoType
- Overblog\GraphQLBundle\Mutation\__DEFINITIONS__\RootMutationType RootMutation Overblog\GraphQLBundle\Mutation\__DEFINITIONS__\RootMutationType
- Overblog\GraphQLBundle\Mutation\__DEFINITIONS__\simpleMutationInputType simpleMutationInput Overblog\GraphQLBundle\Mutation\__DEFINITIONS__\simpleMutationInputType
- Overblog\GraphQLBundle\Mutation\__DEFINITIONS__\simpleMutationPayloadType simpleMutationPayload Overblog\GraphQLBundle\Mutation\__DEFINITIONS__\simpleMutationPayloadType
- Overblog\GraphQLBundle\Mutation\__DEFINITIONS__\simpleMutationWithThunkFieldsInputType simpleMutationWithThunkFieldsInput Overblog\GraphQLBundle\Mutation\__DEFINITIONS__\simpleMutationWithThunkFieldsInputType
- Overblog\GraphQLBundle\Mutation\__DEFINITIONS__\simpleMutationWithThunkFieldsPayloadType simpleMutationWithThunkFieldsPayload Overblog\GraphQLBundle\Mutation\__DEFINITIONS__\simpleMutationWithThunkFieldsPayloadType
- Overblog\GraphQLBundle\Mutation\__DEFINITIONS__\simplePromiseMutationInputType simplePromiseMutationInput Overblog\GraphQLBundle\Mutation\__DEFINITIONS__\simplePromiseMutationInputType
- Overblog\GraphQLBundle\Mutation\__DEFINITIONS__\simplePromiseMutationPayloadType simplePromiseMutationPayload Overblog\GraphQLBundle\Mutation\__DEFINITIONS__\simplePromiseMutationPayloadType
- ------------------------------------------------------------------------------------------ -------------------------------------- ------------------------------------------------------------------------------------------
-
-
-
-GraphQL Mutations Services
-==========================
-
- ---------------------------------------------------------------------------------------------------- ---------------------------------------------------- ---------------------------------------------------------
- solution id aliases service id
- ---------------------------------------------------------------------------------------------------- ---------------------------------------------------- ---------------------------------------------------------
- Overblog\GraphQLBundle\Tests\Functional\App\Mutation\SimpleMutationWithThunkFieldsMutation::mutate simple_mutation_with_thunk_fields (method: mutate) overblog_graphql.test.simple_mutation_with_thunk_fields
- Overblog\GraphQLBundle\Tests\Functional\App\Mutation\SimplePromiseMutation::mutate simple_promise_mutation (method: mutate) overblog_graphql.test.simple_promise_mutation
- ---------------------------------------------------------------------------------------------------- ---------------------------------------------------- ---------------------------------------------------------
-
-
-
-GraphQL Resolvers Services
-==========================
-
- ------------------------------------------------------------------------------ --------------------------------------------------- ------------------------------------------------------------------------------
- solution id aliases service id
- ------------------------------------------------------------------------------ --------------------------------------------------- ------------------------------------------------------------------------------
- Overblog\GraphQLBundle\GraphQL\Relay\Mutation\MutationFieldResolver relay_mutation_field (method: __invoke) Overblog\GraphQLBundle\GraphQL\Relay\Mutation\MutationFieldResolver
- Overblog\GraphQLBundle\GraphQL\Relay\Node\GlobalIdFieldResolver relay_globalid_field (method: __invoke) Overblog\GraphQLBundle\GraphQL\Relay\Node\GlobalIdFieldResolver
- Overblog\GraphQLBundle\GraphQL\Relay\Node\NodeFieldResolver relay_node_field (method: __invoke) Overblog\GraphQLBundle\GraphQL\Relay\Node\NodeFieldResolver
- Overblog\GraphQLBundle\GraphQL\Relay\Node\PluralIdentifyingRootFieldResolver relay_plural_identifying_field (method: __invoke) Overblog\GraphQLBundle\GraphQL\Relay\Node\PluralIdentifyingRootFieldResolver
- ------------------------------------------------------------------------------ --------------------------------------------------- ------------------------------------------------------------------------------
-
-
-
diff --git a/Tests/Functional/Command/fixtures/debug/debug-mutation.txt b/Tests/Functional/Command/fixtures/debug/debug-mutation.txt
index a56827429..23ed6ecd5 100644
--- a/Tests/Functional/Command/fixtures/debug/debug-mutation.txt
+++ b/Tests/Functional/Command/fixtures/debug/debug-mutation.txt
@@ -2,12 +2,12 @@
GraphQL Mutations Services
==========================
- ---------------------------------------------------------------------------------------------------- ----------------------------------------------------
- solution id aliases
- ---------------------------------------------------------------------------------------------------- ----------------------------------------------------
- Overblog\GraphQLBundle\Tests\Functional\App\Mutation\SimpleMutationWithThunkFieldsMutation::mutate simple_mutation_with_thunk_fields (method: mutate)
- Overblog\GraphQLBundle\Tests\Functional\App\Mutation\SimplePromiseMutation::mutate simple_promise_mutation (method: mutate)
- ---------------------------------------------------------------------------------------------------- ----------------------------------------------------
+ ----------------------------------------------------------------- -----------------------------------
+ solution id aliases
+ ----------------------------------------------------------------- -----------------------------------
+ overblog_graphql.test.simple_mutation_with_thunk_fields::mutate simple_mutation_with_thunk_fields
+ overblog_graphql.test.simple_promise_mutation::mutate simple_promise_mutation
+ ----------------------------------------------------------------- -----------------------------------
diff --git a/Tests/Functional/Command/fixtures/debug/debug-resolver.txt b/Tests/Functional/Command/fixtures/debug/debug-resolver.txt
index a85e8a0e6..419f694ff 100644
--- a/Tests/Functional/Command/fixtures/debug/debug-resolver.txt
+++ b/Tests/Functional/Command/fixtures/debug/debug-resolver.txt
@@ -2,14 +2,14 @@
GraphQL Resolvers Services
==========================
- ------------------------------------------------------------------------------ ---------------------------------------------------
- solution id aliases
- ------------------------------------------------------------------------------ ---------------------------------------------------
- Overblog\GraphQLBundle\GraphQL\Relay\Mutation\MutationFieldResolver relay_mutation_field (method: __invoke)
- Overblog\GraphQLBundle\GraphQL\Relay\Node\GlobalIdFieldResolver relay_globalid_field (method: __invoke)
- Overblog\GraphQLBundle\GraphQL\Relay\Node\NodeFieldResolver relay_node_field (method: __invoke)
- Overblog\GraphQLBundle\GraphQL\Relay\Node\PluralIdentifyingRootFieldResolver relay_plural_identifying_field (method: __invoke)
- ------------------------------------------------------------------------------ ---------------------------------------------------
+ ------------------------------------------------------------------------------ --------------------------------
+ solution id aliases
+ ------------------------------------------------------------------------------ --------------------------------
+ Overblog\GraphQLBundle\GraphQL\Relay\Mutation\MutationFieldResolver relay_mutation_field
+ Overblog\GraphQLBundle\GraphQL\Relay\Node\GlobalIdFieldResolver relay_globalid_field
+ Overblog\GraphQLBundle\GraphQL\Relay\Node\NodeFieldResolver relay_node_field
+ Overblog\GraphQLBundle\GraphQL\Relay\Node\PluralIdentifyingRootFieldResolver relay_plural_identifying_field
+ ------------------------------------------------------------------------------ --------------------------------
diff --git a/Tests/Functional/Command/fixtures/debug/debug-type.txt b/Tests/Functional/Command/fixtures/debug/debug-type.txt
index 2b57369bd..0b189e0cf 100644
--- a/Tests/Functional/Command/fixtures/debug/debug-type.txt
+++ b/Tests/Functional/Command/fixtures/debug/debug-type.txt
@@ -5,11 +5,6 @@ GraphQL Types Services
------------------------------------------------------------------------------------------ --------------------------------------
solution id aliases
------------------------------------------------------------------------------------------ --------------------------------------
- GraphQL\Type\Definition\BooleanType Boolean
- GraphQL\Type\Definition\FloatType Float
- GraphQL\Type\Definition\IDType ID
- GraphQL\Type\Definition\IntType Int
- GraphQL\Type\Definition\StringType String
Overblog\GraphQLBundle\Mutation\__DEFINITIONS__\PageInfoType PageInfo
Overblog\GraphQLBundle\Mutation\__DEFINITIONS__\RootMutationType RootMutation
Overblog\GraphQLBundle\Mutation\__DEFINITIONS__\simpleMutationInputType simpleMutationInput
@@ -18,6 +13,11 @@ GraphQL Types Services
Overblog\GraphQLBundle\Mutation\__DEFINITIONS__\simpleMutationWithThunkFieldsPayloadType simpleMutationWithThunkFieldsPayload
Overblog\GraphQLBundle\Mutation\__DEFINITIONS__\simplePromiseMutationInputType simplePromiseMutationInput
Overblog\GraphQLBundle\Mutation\__DEFINITIONS__\simplePromiseMutationPayloadType simplePromiseMutationPayload
+ overblog_graphql.definition.boolean_type Boolean
+ overblog_graphql.definition.float_type Float
+ overblog_graphql.definition.id_type ID
+ overblog_graphql.definition.int_type Int
+ overblog_graphql.definition.string_type String
------------------------------------------------------------------------------------------ --------------------------------------
diff --git a/Tests/Relay/Node/NodeFieldDefinitionTest.php b/Tests/Relay/Node/NodeFieldDefinitionTest.php
index 7d6a4683d..790c7bcf4 100644
--- a/Tests/Relay/Node/NodeFieldDefinitionTest.php
+++ b/Tests/Relay/Node/NodeFieldDefinitionTest.php
@@ -2,7 +2,6 @@
namespace Overblog\GraphQLBundle\Tests\Relay\Node;
-use Overblog\GraphQLBundle\GraphQL\Relay\Node\NodeFieldResolver;
use Overblog\GraphQLBundle\Relay\Node\NodeFieldDefinition;
use PHPUnit\Framework\TestCase;
@@ -53,7 +52,7 @@ public function testValidConfig($idFetcher, $idFetcherCallbackArg, $nodeInterfac
'description' => 'Fetches an object given its ID',
'type' => $nodeInterfaceType,
'args' => ['id' => ['type' => 'ID!', 'description' => 'The ID of an object']],
- 'resolve' => '@=resolver(\''.addslashes(NodeFieldResolver::class).'\', [args, context, info, idFetcherCallback('.$idFetcherCallbackArg.')])',
+ 'resolve' => '@=resolver(\'relay_node_field\', [args, context, info, idFetcherCallback('.$idFetcherCallbackArg.')])',
];
$this->assertEquals($expected, $this->definition->toMappingDefinition($config));
diff --git a/Tests/Relay/Node/PluralIdentifyingRootFieldDefinitionTest.php b/Tests/Relay/Node/PluralIdentifyingRootFieldDefinitionTest.php
index ea1da4dd3..d5c1b738a 100644
--- a/Tests/Relay/Node/PluralIdentifyingRootFieldDefinitionTest.php
+++ b/Tests/Relay/Node/PluralIdentifyingRootFieldDefinitionTest.php
@@ -2,7 +2,6 @@
namespace Overblog\GraphQLBundle\Tests\Relay\Node;
-use Overblog\GraphQLBundle\GraphQL\Relay\Node\PluralIdentifyingRootFieldResolver;
use Overblog\GraphQLBundle\Relay\Node\PluralIdentifyingRootFieldDefinition;
use PHPUnit\Framework\TestCase;
@@ -97,7 +96,7 @@ public function testValidConfig($resolveSingleInput, $expectedResolveSingleInput
$expected = [
'type' => '[User]',
'args' => ['username' => ['type' => '[UserInput!]!']],
- 'resolve' => '@=resolver(\''.addslashes(PluralIdentifyingRootFieldResolver::class).'\', [args[\'username\'], context, info, resolveSingleInputCallback('.$expectedResolveSingleInputCallbackArg.')])',
+ 'resolve' => '@=resolver(\'relay_plural_identifying_field\', [args[\'username\'], context, info, resolveSingleInputCallback('.$expectedResolveSingleInputCallbackArg.')])',
];
$this->assertEquals($expected, $this->definition->toMappingDefinition($config));
diff --git a/UPGRADE-0.11.md b/UPGRADE-0.11.md
index 449bd75d5..5a6797406 100644
--- a/UPGRADE-0.11.md
+++ b/UPGRADE-0.11.md
@@ -10,6 +10,7 @@ UPGRADE FROM 0.10 to 0.11
- [Type autoMapping and Symfony DI autoconfigure](#type-automapping-and-symfony-di-autoconfigure)
- [Events](#events)
- [Explicitly declare non detected types](#explicitly-declare-non-detected-types)
+- [Change fluent resolvers id](#change-fluent-resolvers-id)
### GraphiQL
@@ -154,6 +155,7 @@ UPGRADE FROM 0.10 to 0.11
}
```
**Before 0.11**: DateTimeType could be accessed by FQCN `App\GraphQL\Type\DateTimeType` and the real `DateTimeType`.
+
**Since 0.11**: Only FQCN `App\GraphQL\Type\DateTimeType` is accessible
here how this can be done in 0.11:
@@ -252,3 +254,23 @@ UPGRADE FROM 0.10 to 0.11
`context` is of type `ArrayObject` and `rootValue` has no typeHint (default: `null`) so
`$context !== $info->rootValue` and `$context !== $value` in root query resolver.
Uploaded files is no more accessible under `$info->rootValue['request_files']` out of the box.
+
+### Change fluent resolvers id
+
+ The use of class name as prefix of fluent resolver id remove the possibility to use same class as 2 different services.
+ See issue [#296](https://github.com/overblog/GraphQLBundle/issues/296) for more detail
+ That's the reason why starting v0.11 we are using service id as prefix (like in Symfony 4.1)...
+
+ Example:
+ ```yaml
+ services:
+ app.resolver.greetings:
+ class: App\GraphQL\Resolver\Greetings
+ tags:
+ - { name: overblog_graphql.resolver, method: __invoke, alias: say_hello }
+ - { name: overblog_graphql.resolver }
+ ```
+
+ **Before 0.11**: `'@=resolver("App\\GraphQL\\Resolver\\Greetings", [args['name']])'`
+
+ **Since 0.11**: `'@=resolver("app.resolver.greetings", [args['name']])'`
diff --git a/composer.json b/composer.json
index dbc97cdd5..ec8825850 100644
--- a/composer.json
+++ b/composer.json
@@ -30,9 +30,8 @@
},
"require": {
"php": ">=5.6",
- "doctrine/doctrine-cache-bundle": "^1.2",
"overblog/graphql-php-generator": "^0.7.0",
- "symfony/cache": "^3.1 || ^4.0",
+ "psr/log": "^1.0",
"symfony/config": "^3.1 || ^4.0",
"symfony/dependency-injection": "^3.1 || ^4.0",
"symfony/event-dispatcher": "^3.1 || ^4.0",
@@ -49,7 +48,6 @@
},
"require-dev": {
"phpunit/phpunit": "^5.7.26 || ^6.0",
- "psr/log": "^1.0",
"react/promise": "^2.5",
"sensio/framework-extra-bundle": "^3.0",
"symfony/asset": "^3.1 || ^4.0",