Infer type name from class name for those using inheritance

This commit is contained in:
vladar 2016-10-23 21:32:54 +07:00
parent 221ec6f792
commit e4fa881cc3
7 changed files with 81 additions and 1 deletions

View File

@ -25,6 +25,10 @@ class InputObjectType extends Type implements InputType
*/ */
public function __construct(array $config) public function __construct(array $config)
{ {
if (!isset($config['name'])) {
$config['name'] = $this->tryInferName();
}
Config::validate($config, [ Config::validate($config, [
'name' => Config::STRING | Config::REQUIRED, 'name' => Config::STRING | Config::REQUIRED,
'fields' => Config::arrayOf([ 'fields' => Config::arrayOf([
@ -32,7 +36,7 @@ class InputObjectType extends Type implements InputType
'type' => Config::INPUT_TYPE | Config::REQUIRED, 'type' => Config::INPUT_TYPE | Config::REQUIRED,
'defaultValue' => Config::ANY, 'defaultValue' => Config::ANY,
'description' => Config::STRING 'description' => Config::STRING
], Config::KEY_AS_NAME | Config::MAYBE_THUNK), ], Config::KEY_AS_NAME | Config::MAYBE_THUNK | Config::MAYBE_TYPE),
'description' => Config::STRING 'description' => Config::STRING
]); ]);

View File

@ -35,6 +35,10 @@ class InterfaceType extends Type implements AbstractType, OutputType, CompositeT
*/ */
public function __construct(array $config) public function __construct(array $config)
{ {
if (!isset($config['name'])) {
$config['name'] = $this->tryInferName();
}
Config::validate($config, [ Config::validate($config, [
'name' => Config::STRING, 'name' => Config::STRING,
'fields' => Config::arrayOf( 'fields' => Config::arrayOf(

View File

@ -79,6 +79,10 @@ class ObjectType extends Type implements OutputType, CompositeType
*/ */
public function __construct(array $config) public function __construct(array $config)
{ {
if (!isset($config['name'])) {
$config['name'] = $this->tryInferName();
}
Utils::invariant(!empty($config['name']), 'Every type is expected to have name'); Utils::invariant(!empty($config['name']), 'Every type is expected to have name');
// Note: this validation is disabled by default, because it is resource-consuming // Note: this validation is disabled by default, because it is resource-consuming

View File

@ -242,6 +242,27 @@ abstract class Type
*/ */
public $description; public $description;
/**
* @return null|string
*/
protected function tryInferName()
{
if ($this->name) {
return $this->name;
}
// If class is extended - infer name from className
// QueryType -> Type
// SomeOtherType -> SomeOther
$tmp = new \ReflectionClass($this);
$name = $tmp->getShortName();
if ($tmp->getNamespaceName() !== __NAMESPACE__) {
return preg_replace('~Type$~', '', $name);
}
return null;
}
/** /**
* @return string * @return string
*/ */

View File

@ -36,6 +36,10 @@ class UnionType extends Type implements AbstractType, OutputType, CompositeType
*/ */
public function __construct($config) public function __construct($config)
{ {
if (!isset($config['name'])) {
$config['name'] = $this->tryInferName();
}
Config::validate($config, [ Config::validate($config, [
'name' => Config::STRING | Config::REQUIRED, 'name' => Config::STRING | Config::REQUIRED,
'types' => Config::arrayOf(Config::OBJECT_TYPE, Config::MAYBE_THUNK | Config::REQUIRED), 'types' => Config::arrayOf(Config::OBJECT_TYPE, Config::MAYBE_THUNK | Config::REQUIRED),

View File

@ -1,6 +1,8 @@
<?php <?php
namespace GraphQL\Tests\Type; namespace GraphQL\Tests\Type;
require_once __DIR__ . '/TestClasses.php';
use GraphQL\Schema; use GraphQL\Schema;
use GraphQL\Type\Definition\Config; use GraphQL\Type\Definition\Config;
use GraphQL\Type\Definition\EnumType; use GraphQL\Type\Definition\EnumType;
@ -666,4 +668,14 @@ class DefinitionTest extends \PHPUnit_Framework_TestCase
$this->assertEquals($interface, $testField->getType()); $this->assertEquals($interface, $testField->getType());
$this->assertEquals('test', $testField->name); $this->assertEquals('test', $testField->name);
} }
public function testInfersNameFromClassname()
{
$myObj = new MyCustomType();
$this->assertEquals('MyCustom', $myObj->name);
$otherCustom = new OtherCustom();
$this->assertEquals('OtherCustom', $otherCustom->name);
}
} }

View File

@ -0,0 +1,31 @@
<?php
namespace GraphQL\Tests\Type;
use GraphQL\Type\Definition\ObjectType;
use GraphQL\Type\Definition\Type;
class MyCustomType extends ObjectType
{
public function __construct()
{
$config = [
'fields' => [
'a' => Type::string()
]
];
parent::__construct($config);
}
}
class OtherCustom extends ObjectType
{
public function __construct()
{
$config = [
'fields' => [
'b' => Type::string()
]
];
parent::__construct($config);
}
}