GraphQL\Type\SchemaValidator::typesInterfacesMustShowThemAsPossibleRule PHP Method

typesInterfacesMustShowThemAsPossibleRule() public static method

    public static function typesInterfacesMustShowThemAsPossibleRule()
    {
        return function ($context) {
            /** @var Schema $schema */
            $schema = $context['schema'];
            $typeMap = $schema->getTypeMap();
            $errors = [];
            foreach ($typeMap as $typeName => $type) {
                if ($type instanceof ObjectType) {
                    $interfaces = $type->getInterfaces();
                    foreach ($interfaces as $interfaceType) {
                        if (!$interfaceType->isPossibleType($type)) {
                            $errors[] = new Error("{$typeName} implements interface {$interfaceType->name}, but " . "{$interfaceType->name} does not list it as possible!");
                        }
                    }
                }
            }
            return !empty($errors) ? $errors : null;
        };
    }

Usage Example

示例#1
0
 public function testRejectsWhenAnImplementationIsNotAPossibleType()
 {
     // rejects when an implementation is not a possible type
     $interfaceType = new InterfaceType(['name' => 'InterfaceType', 'fields' => []]);
     $subType = new ObjectType(['name' => 'SubType', 'fields' => [], 'interfaces' => []]);
     $tmp = new \ReflectionObject($subType);
     $prop = $tmp->getProperty('_interfaces');
     $prop->setAccessible(true);
     $prop->setValue($subType, [$interfaceType]);
     // Sanity check the test.
     $this->assertEquals([$interfaceType], $subType->getInterfaces());
     $this->assertSame(false, $interfaceType->isPossibleType($subType));
     // Need to make sure SubType is in the schema! We rely on
     // possibleTypes to be able to see it unless it's explicitly used.
     $schema = new Schema($interfaceType, $subType);
     // Another sanity check.
     $this->assertSame($subType, $schema->getType('SubType'));
     $validationResult = SchemaValidator::validate($schema, [SchemaValidator::typesInterfacesMustShowThemAsPossibleRule()]);
     $this->assertSame(false, $validationResult->isValid);
     $this->assertSame(1, count($validationResult->errors));
     $this->assertSame('SubType implements interface InterfaceType, but InterfaceType does ' . 'not list it as possible!', $validationResult->errors[0]->message);
     /*
     
        var validationResult = validateSchema(
          schema,
          [TypesInterfacesMustShowThemAsPossible]
        );
        expect(validationResult.isValid).to.equal(false);
        expect(validationResult.errors.length).to.equal(1);
        expect(validationResult.errors[0].message).to.equal(
          'SubType implements interface InterfaceType, but InterfaceType does ' +
          'not list it as possible!'
        );
     */
 }