diff --git a/DependencyInjection/TypesConfiguration.php b/DependencyInjection/TypesConfiguration.php index 377ec4bfc..e65c4d6e9 100644 --- a/DependencyInjection/TypesConfiguration.php +++ b/DependencyInjection/TypesConfiguration.php @@ -61,6 +61,9 @@ private function addConfigSelection() ->info('One of internal or custom types.') ->end() ->end() + ->variableNode('fieldsDefaultAccess') + ->info('Default access control to fields (expression language can be use here)') + ->end() ->append($this->addFieldsSelection('fields')) ->variableNode('resolveType')->end() ->arrayNode('values') diff --git a/README.md b/README.md index a43c4a256..36d22f471 100644 --- a/README.md +++ b/README.md @@ -617,9 +617,9 @@ class CharacterResolver Access Control -------------- -An access control can be add on each field using `config.fields.*.access`. +An access control can be add on each field using `config.fields.*.access` or globally with `config.fieldsDefaultAccess`. If `config.fields.*.access` value is true field will be normally resolved but will be `null` otherwise. -Default value is true. +Act like access is`true` if not set. In the example below the Human name is available only for authenticated users. diff --git a/Resolver/Config/FieldsConfigSolution.php b/Resolver/Config/FieldsConfigSolution.php index 3191042c5..30437ca90 100644 --- a/Resolver/Config/FieldsConfigSolution.php +++ b/Resolver/Config/FieldsConfigSolution.php @@ -17,7 +17,7 @@ use Overblog\GraphQLBundle\Relay\Connection\Output\Edge; use Overblog\GraphQLBundle\Resolver\ResolverInterface; -class FieldsConfigSolution extends AbstractConfigSolution implements UniqueConfigSolutionInterface +class FieldsConfigSolution extends AbstractConfigSolution { /** * @var TypeConfigSolution @@ -37,19 +37,24 @@ public function __construct( $this->resolveCallbackConfigSolution = $resolveCallbackConfigSolution; } - public function solve($values, $config = null) + public function solve($values, array &$config = null) { // builder must be last $fieldsTreated = ['type', 'args', 'argsBuilder', 'deprecationReason', 'builder']; + $fieldsDefaultAccess = isset($config['fieldsDefaultAccess']) ? $config['fieldsDefaultAccess'] : null; + unset($config['fieldsDefaultAccess']); + foreach ($values as $field => &$options) { + //init access with fields default access if needed + $options['access'] = isset($options['access']) ? $options['access'] : $fieldsDefaultAccess; + foreach ($fieldsTreated as $fieldTreated) { if (isset($options[$fieldTreated])) { $method = 'solve'.ucfirst($fieldTreated); $options = $this->$method($options, $field); } } - $options = $this->resolveResolveAndAccessIfNeeded($options); } diff --git a/Resolver/Config/ResolveCallbackConfigSolution.php b/Resolver/Config/ResolveCallbackConfigSolution.php index c26d30435..c80e111c8 100644 --- a/Resolver/Config/ResolveCallbackConfigSolution.php +++ b/Resolver/Config/ResolveCallbackConfigSolution.php @@ -11,9 +11,9 @@ namespace Overblog\GraphQLBundle\Resolver\Config; -class ResolveCallbackConfigSolution extends AbstractConfigSolution implements UniqueConfigSolutionInterface +class ResolveCallbackConfigSolution extends AbstractConfigSolution { - public function solve($value, $config = null) + public function solve($value) { if (is_callable($value)) { return $value; diff --git a/Resolver/Config/UniqueConfigSolutionInterface.php b/Resolver/Config/UniqueConfigSolutionInterface.php deleted file mode 100644 index 865dd212e..000000000 --- a/Resolver/Config/UniqueConfigSolutionInterface.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Overblog\GraphQLBundle\Resolver\Config; - -interface UniqueConfigSolutionInterface extends ConfigSolutionInterface -{ -} diff --git a/Resolver/Config/ValuesConfigSolution.php b/Resolver/Config/ValuesConfigSolution.php index fb5138ed0..02bda6c28 100644 --- a/Resolver/Config/ValuesConfigSolution.php +++ b/Resolver/Config/ValuesConfigSolution.php @@ -11,9 +11,9 @@ namespace Overblog\GraphQLBundle\Resolver\Config; -class ValuesConfigSolution extends AbstractConfigSolution implements UniqueConfigSolutionInterface +class ValuesConfigSolution extends AbstractConfigSolution { - public function solve($values, $config = null) + public function solve($values) { if (!empty($values)) { foreach ($values as $name => &$options) { diff --git a/Resolver/ConfigResolver.php b/Resolver/ConfigResolver.php index 3f5f6341e..c0cac4f85 100644 --- a/Resolver/ConfigResolver.php +++ b/Resolver/ConfigResolver.php @@ -44,7 +44,7 @@ public function resolve($config) } $options = $this->getSolutionOptions($name); - $values = call_user_func_array([$solution, $options['method']], [$values]); + $values = call_user_func_array([$solution, $options['method']], [$values, &$config]); } return $config;