diff --git a/.gitignore b/.gitignore index fa07e1e1f..5fbd1c946 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,4 @@ composer.lock composer.phar phpcs.xml phpstan.neon -vendor/ +vendor/ \ No newline at end of file diff --git a/src/Type/Definition/FieldArgument.php b/src/Type/Definition/FieldArgument.php index 33cad0d81..6510e0d91 100644 --- a/src/Type/Definition/FieldArgument.php +++ b/src/Type/Definition/FieldArgument.php @@ -8,6 +8,7 @@ use GraphQL\Language\AST\InputValueDefinitionNode; use GraphQL\Utils\Utils; use function is_array; +use function is_callable; use function is_string; use function sprintf; @@ -66,12 +67,21 @@ public function __construct(array $def) } /** - * @param mixed[] $config + * @param mixed[]|callable $config * * @return FieldArgument[] + * @throws \InvalidArgumentException */ - public static function createMap(array $config) + public static function createMap($config) { + if (is_callable($config)) { + $config = $config(); + } + + if (! is_array($config)) { + throw new \InvalidArgumentException('$config must be an array or a callable which returns such an array.'); + } + $map = []; foreach ($config as $name => $argConfig) { if (! is_array($argConfig)) { diff --git a/src/Type/Definition/FieldDefinition.php b/src/Type/Definition/FieldDefinition.php index 34ad66f3f..521bd5770 100644 --- a/src/Type/Definition/FieldDefinition.php +++ b/src/Type/Definition/FieldDefinition.php @@ -109,9 +109,9 @@ public static function defineFieldMap(Type $type, $fields) $field['name'] = $name; } - if (isset($field['args']) && ! is_array($field['args'])) { + if (isset($field['args']) && ! is_array($field['args']) && ! is_callable($field['args'])) { throw new InvariantViolation( - sprintf('%s.%s args must be an array.', $type->name, $name) + sprintf('%s.%s args must be an array or a callable which returns such an array.', $type->name, $name) ); } $fieldDef = self::create($field);