Deprecated callbacks in "type" option of field/argument definitions (see #35)

This commit is contained in:
vladar 2016-10-23 00:49:25 +07:00
parent 9964c88f32
commit c11f25794a
9 changed files with 130 additions and 114 deletions

View File

@ -1,6 +1,7 @@
<?php <?php
namespace GraphQL\Type\Definition; namespace GraphQL\Type\Definition;
use GraphQL\Error\InvariantViolation;
use GraphQL\Utils; use GraphQL\Utils;
/* /*
@ -191,14 +192,19 @@ abstract class Type
public static function resolve($type) public static function resolve($type)
{ {
if (is_callable($type)) { if (is_callable($type)) {
trigger_error(
'Passing type as closure is deprecated (see https://github.com/webonyx/graphql-php/issues/35 for alternatives)',
E_USER_DEPRECATED
);
$type = $type(); $type = $type();
} }
Utils::invariant( if (!$type instanceof Type) {
$type instanceof Type, throw new InvariantViolation(sprintf(
'Expecting instance of ' . __CLASS__ . ' (or callable returning instance of that type), got "%s"', 'Expecting instance of ' . __CLASS__ . ', got "%s"',
Utils::getVariableType($type) Utils::getVariableType($type)
); ));
}
return $type; return $type;
} }

View File

@ -498,7 +498,7 @@ EOD;
} }
], ],
'possibleTypes' => [ 'possibleTypes' => [
'type' => Type::listOf(Type::nonNull([__CLASS__, '_type'])), 'type' => Type::listOf(Type::nonNull(self::_type())),
'resolve' => function ($type, $args, $context, ResolveInfo $info) { 'resolve' => function ($type, $args, $context, ResolveInfo $info) {
if ($type instanceof InterfaceType || $type instanceof UnionType) { if ($type instanceof InterfaceType || $type instanceof UnionType) {
return $info->schema->getPossibleTypes($type); return $info->schema->getPossibleTypes($type);

View File

@ -29,7 +29,8 @@ class ExecutorSchemaTest extends \PHPUnit_Framework_TestCase
$BlogAuthor = new ObjectType([ $BlogAuthor = new ObjectType([
'name' => 'Author', 'name' => 'Author',
'fields' => [ 'fields' => function() use (&$BlogArticle, &$BlogImage) {
return [
'id' => ['type' => Type::string()], 'id' => ['type' => Type::string()],
'name' => ['type' => Type::string()], 'name' => ['type' => Type::string()],
'pic' => [ 'pic' => [
@ -39,10 +40,9 @@ class ExecutorSchemaTest extends \PHPUnit_Framework_TestCase
return $obj['pic']($args['width'], $args['height']); return $obj['pic']($args['width'], $args['height']);
} }
], ],
'recentArticle' => ['type' => function () use (&$BlogArticle) { 'recentArticle' => $BlogArticle
return $BlogArticle; ];
}] }
]
]); ]);
$BlogArticle = new ObjectType([ $BlogArticle = new ObjectType([

View File

@ -116,7 +116,8 @@ class ExecutorTest extends \PHPUnit_Framework_TestCase
$deepDataType = null; $deepDataType = null;
$dataType = new ObjectType([ $dataType = new ObjectType([
'name' => 'DataType', 'name' => 'DataType',
'fields' => [ 'fields' => function() use (&$dataType, &$deepDataType) {
return [
'a' => [ 'type' => Type::string() ], 'a' => [ 'type' => Type::string() ],
'b' => [ 'type' => Type::string() ], 'b' => [ 'type' => Type::string() ],
'c' => [ 'type' => Type::string() ], 'c' => [ 'type' => Type::string() ],
@ -130,9 +131,10 @@ class ExecutorTest extends \PHPUnit_Framework_TestCase
return $obj['pic']($args['size']); return $obj['pic']($args['size']);
} }
], ],
'promise' => ['type' => function() use (&$dataType) {return $dataType;}], 'promise' => ['type' => $dataType],
'deep' => [ 'type' => function() use(&$deepDataType) {return $deepDataType; }], 'deep' => ['type' => $deepDataType],
] ];
}
]); ]);
$deepDataType = new ObjectType([ $deepDataType = new ObjectType([
@ -170,7 +172,8 @@ class ExecutorTest extends \PHPUnit_Framework_TestCase
$Type = new ObjectType([ $Type = new ObjectType([
'name' => 'Type', 'name' => 'Type',
'fields' => [ 'fields' => function() use (&$Type) {
return [
'a' => ['type' => Type::string(), 'resolve' => function () { 'a' => ['type' => Type::string(), 'resolve' => function () {
return 'Apple'; return 'Apple';
}], }],
@ -181,14 +184,13 @@ class ExecutorTest extends \PHPUnit_Framework_TestCase
return 'Cherry'; return 'Cherry';
}], }],
'deep' => [ 'deep' => [
'type' => function () use (&$Type) { 'type' => $Type,
return $Type;
},
'resolve' => function () { 'resolve' => function () {
return []; return [];
} }
] ]
] ];
}
]); ]);
$schema = new Schema(['query' => $Type]); $schema = new Schema(['query' => $Type]);
$expected = [ $expected = [

View File

@ -58,16 +58,14 @@ class NonNullTest extends \PHPUnit_Framework_TestCase
$dataType = new ObjectType([ $dataType = new ObjectType([
'name' => 'DataType', 'name' => 'DataType',
'fields' => [ 'fields' => function() use (&$dataType) {
return [
'sync' => ['type' => Type::string()], 'sync' => ['type' => Type::string()],
'nonNullSync' => ['type' => Type::nonNull(Type::string())], 'nonNullSync' => ['type' => Type::nonNull(Type::string())],
'nest' => ['type' => function () use (&$dataType) { 'nest' => $dataType,
return $dataType; 'nonNullNest' => Type::nonNull($dataType)
}], ];
'nonNullNest' => ['type' => function () use (&$dataType) { }
return Type::nonNull($dataType);
}]
]
]); ]);
$this->schema = new Schema(['query' => $dataType]); $this->schema = new Schema(['query' => $dataType]);

View File

@ -92,15 +92,17 @@ class DefinitionTest extends \PHPUnit_Framework_TestCase
$this->blogAuthor = new ObjectType([ $this->blogAuthor = new ObjectType([
'name' => 'Author', 'name' => 'Author',
'fields' => [ 'fields' => function() {
return [
'id' => ['type' => Type::string()], 'id' => ['type' => Type::string()],
'name' => ['type' => Type::string()], 'name' => ['type' => Type::string()],
'pic' => [ 'type' => $this->blogImage, 'args' => [ 'pic' => [ 'type' => $this->blogImage, 'args' => [
'width' => ['type' => Type::int()], 'width' => ['type' => Type::int()],
'height' => ['type' => Type::int()] 'height' => ['type' => Type::int()]
]], ]],
'recentArticle' => ['type' => function() {return $this->blogArticle;}], 'recentArticle' => $this->blogArticle,
], ];
},
]); ]);
$this->blogArticle = new ObjectType([ $this->blogArticle = new ObjectType([

View File

@ -398,9 +398,11 @@ class SchemaValidatorTest extends \PHPUnit_Framework_TestCase
foreach ($kinds as $kind) { foreach ($kinds as $kind) {
$someOutputType = new $kind([ $someOutputType = new $kind([
'name' => 'SomeOutputType', 'name' => 'SomeOutputType',
'fields' => [ 'fields' => function() {
'sneaky' => ['type' => function() {return $this->someInputObjectType;}] return [
] 'sneaky' => $this->someInputObjectType
];
}
]); ]);
$schema = new Schema(['query' => $someOutputType]); $schema = new Schema(['query' => $someOutputType]);
@ -545,9 +547,11 @@ class SchemaValidatorTest extends \PHPUnit_Framework_TestCase
{ {
$someIncorrectInputType = new InputObjectType([ $someIncorrectInputType = new InputObjectType([
'name' => 'SomeIncorrectInputType', 'name' => 'SomeIncorrectInputType',
'fields' => [ 'fields' => function() use ($argType) {
'val' => ['type' => function() use ($argType) {return $argType;} ] return [
] 'val' => ['type' => $argType ]
];
}
]); ]);
$queryType = new ObjectType([ $queryType = new ObjectType([

View File

@ -59,16 +59,15 @@ class QuerySecuritySchema
self::$humanType = new ObjectType( self::$humanType = new ObjectType(
[ [
'name' => 'Human', 'name' => 'Human',
'fields' => [ 'fields' => function() {
return [
'firstName' => ['type' => Type::nonNull(Type::string())], 'firstName' => ['type' => Type::nonNull(Type::string())],
'dogs' => [ 'dogs' => [
'type' => function () { 'type' => Type::nonNull(
return Type::nonNull(
Type::listOf( Type::listOf(
Type::nonNull(self::buildDogType()) Type::nonNull(self::buildDogType())
) )
); ),
},
'complexity' => function ($childrenComplexity, $args) { 'complexity' => function ($childrenComplexity, $args) {
$complexity = isset($args['name']) ? 1 : 10; $complexity = isset($args['name']) ? 1 : 10;
@ -76,7 +75,8 @@ class QuerySecuritySchema
}, },
'args' => ['name' => ['type' => Type::string()]], 'args' => ['name' => ['type' => Type::string()]],
], ],
], ];
},
] ]
); );

View File

@ -94,7 +94,8 @@ abstract class TestCase extends \PHPUnit_Framework_TestCase
$Cat = new ObjectType([ $Cat = new ObjectType([
'name' => 'Cat', 'name' => 'Cat',
'isTypeOf' => function() {return true;}, 'isTypeOf' => function() {return true;},
'fields' => [ 'fields' => function() use (&$FurColor) {
return [
'name' => [ 'name' => [
'type' => Type::string(), 'type' => Type::string(),
'args' => [ 'surname' => [ 'type' => Type::boolean() ] ] 'args' => [ 'surname' => [ 'type' => Type::boolean() ] ]
@ -102,8 +103,9 @@ abstract class TestCase extends \PHPUnit_Framework_TestCase
'nickname' => ['type' => Type::string()], 'nickname' => ['type' => Type::string()],
'meows' => ['type' => Type::boolean()], 'meows' => ['type' => Type::boolean()],
'meowVolume' => ['type' => Type::int()], 'meowVolume' => ['type' => Type::int()],
'furColor' => ['type' => function() use (&$FurColor) {return $FurColor;}] 'furColor' => $FurColor
], ];
},
'interfaces' => [$Being, $Pet] 'interfaces' => [$Being, $Pet]
]); ]);
@ -128,15 +130,17 @@ abstract class TestCase extends \PHPUnit_Framework_TestCase
'name' => 'Human', 'name' => 'Human',
'isTypeOf' => function() {return true;}, 'isTypeOf' => function() {return true;},
'interfaces' => [$Being, $Intelligent], 'interfaces' => [$Being, $Intelligent],
'fields' => [ 'fields' => function() use (&$Human, $Pet) {
return [
'name' => [ 'name' => [
'type' => Type::string(), 'type' => Type::string(),
'args' => ['surname' => ['type' => Type::boolean()]] 'args' => ['surname' => ['type' => Type::boolean()]]
], ],
'pets' => ['type' => Type::listOf($Pet)], 'pets' => ['type' => Type::listOf($Pet)],
'relatives' => ['type' => function() use (&$Human) {return Type::listOf($Human); }], 'relatives' => ['type' => Type::listOf($Human)],
'iq' => ['type' => Type::int()] 'iq' => ['type' => Type::int()]
] ];
}
]); ]);
$Alien = new ObjectType([ $Alien = new ObjectType([