Scrutinizer GitHub App not installed

We could not synchronize checks via GitHub's checks API since Scrutinizer's GitHub App is not installed for this repository.

Install GitHub App

Passed
Pull Request — master (#251)
by Renato
08:29
created

OverblogGraphQLExtension::setServicesAliases()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 9
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 3

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 9
ccs 6
cts 6
cp 1
rs 9.6666
cc 3
eloc 5
nc 3
nop 2
crap 3
1
<?php
2
3
namespace Overblog\GraphQLBundle\DependencyInjection;
4
5
use GraphQL\Type\Schema;
6
use Overblog\GraphQLBundle\CacheWarmer\CompileCacheWarmer;
7
use Overblog\GraphQLBundle\Config\Processor\BuilderProcessor;
8
use Overblog\GraphQLBundle\EventListener\ClassLoaderListener;
9
use Symfony\Component\Cache\Adapter\ArrayAdapter;
10
use Symfony\Component\Config\FileLocator;
11
use Symfony\Component\DependencyInjection\ContainerBuilder;
12
use Symfony\Component\DependencyInjection\Definition;
13
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
14
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
15
use Symfony\Component\DependencyInjection\Reference;
16
use Symfony\Component\ExpressionLanguage\ParserCache\ArrayParserCache;
17
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
18
use Symfony\Component\HttpKernel\Kernel;
19
20
class OverblogGraphQLExtension extends Extension implements PrependExtensionInterface
21
{
22 25
    public function load(array $configs, ContainerBuilder $container)
23
    {
24 25
        $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
25 25
        $loader->load('services.yml');
26 25
        $loader->load('graphql_types.yml');
27
28 25
        $config = $this->treatConfigs($configs, $container);
29
30 25
        $this->setBatchingMethod($config, $container);
0 ignored issues
show
Bug introduced by
It seems like $config defined by $this->treatConfigs($configs, $container) on line 28 can also be of type null; however, Overblog\GraphQLBundle\D...on::setBatchingMethod() does only seem to accept array, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
31 25
        $this->setExpressionLanguageDefaultParser($container);
32 25
        $this->setServicesAliases($config, $container);
0 ignored issues
show
Bug introduced by
It seems like $config defined by $this->treatConfigs($configs, $container) on line 28 can also be of type null; however, Overblog\GraphQLBundle\D...n::setServicesAliases() does only seem to accept array, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
33 25
        $this->setSchemaBuilderArguments($config, $container);
0 ignored issues
show
Bug introduced by
It seems like $config defined by $this->treatConfigs($configs, $container) on line 28 can also be of type null; however, Overblog\GraphQLBundle\D...chemaBuilderArguments() does only seem to accept array, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
34 25
        $this->setSchemaArguments($config, $container);
0 ignored issues
show
Bug introduced by
It seems like $config defined by $this->treatConfigs($configs, $container) on line 28 can also be of type null; however, Overblog\GraphQLBundle\D...n::setSchemaArguments() does only seem to accept array, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
35 25
        $this->setErrorHandlerArguments($config, $container);
0 ignored issues
show
Bug introduced by
It seems like $config defined by $this->treatConfigs($configs, $container) on line 28 can also be of type null; however, Overblog\GraphQLBundle\D...ErrorHandlerArguments() does only seem to accept array, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
36 25
        $this->setSecurity($config, $container);
0 ignored issues
show
Bug introduced by
It seems like $config defined by $this->treatConfigs($configs, $container) on line 28 can also be of type null; however, Overblog\GraphQLBundle\D...xtension::setSecurity() does only seem to accept array, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
37 25
        $this->setConfigBuilders($config, $container);
0 ignored issues
show
Bug introduced by
It seems like $config defined by $this->treatConfigs($configs, $container) on line 28 can also be of type null; however, Overblog\GraphQLBundle\D...on::setConfigBuilders() does only seem to accept array, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
38 25
        $this->setShowDebug($config, $container);
0 ignored issues
show
Bug introduced by
It seems like $config defined by $this->treatConfigs($configs, $container) on line 28 can also be of type null; however, Overblog\GraphQLBundle\D...tension::setShowDebug() does only seem to accept array, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
39 25
        $this->setDefinitionParameters($config, $container);
0 ignored issues
show
Bug introduced by
It seems like $config defined by $this->treatConfigs($configs, $container) on line 28 can also be of type null; however, Overblog\GraphQLBundle\D...tDefinitionParameters() does only seem to accept array, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
40 25
        $this->setClassLoaderListener($config, $container);
0 ignored issues
show
Bug introduced by
It seems like $config defined by $this->treatConfigs($configs, $container) on line 28 can also be of type null; however, Overblog\GraphQLBundle\D...etClassLoaderListener() does only seem to accept array, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
41 25
        $this->setCompilerCacheWarmer($config, $container);
0 ignored issues
show
Bug introduced by
It seems like $config defined by $this->treatConfigs($configs, $container) on line 28 can also be of type null; however, Overblog\GraphQLBundle\D...etCompilerCacheWarmer() does only seem to accept array, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
42
43 25
        $container->setParameter($this->getAlias().'.resources_dir', realpath(__DIR__.'/../Resources'));
44 25
    }
45
46 23
    public function prepend(ContainerBuilder $container)
47
    {
48 23
        $configs = $container->getExtensionConfig($this->getAlias());
49 23
        $configs = $container->getParameterBag()->resolveValue($configs);
50 23
        $config = $this->treatConfigs($configs, $container, true);
51
52
        /** @var OverblogGraphQLTypesExtension $typesExtension */
53 23
        $typesExtension = $container->getExtension($this->getAlias().'_types');
54 23
        $typesExtension->containerPrependExtensionConfig($config, $container);
0 ignored issues
show
Bug introduced by
It seems like $config defined by $this->treatConfigs($configs, $container, true) on line 50 can also be of type null; however, Overblog\GraphQLBundle\D...rependExtensionConfig() does only seem to accept array, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
55 23
    }
56
57 25
    public function getAlias()
58
    {
59 25
        return 'overblog_graphql';
60
    }
61
62 25
    public function getConfiguration(array $config, ContainerBuilder $container)
63
    {
64 25
        return new Configuration(
65 25
            $container->getParameter('kernel.debug'),
66 25
            $container->hasParameter('kernel.cache_dir') ? $container->getParameter('kernel.cache_dir') : null
67
        );
68
    }
69
70 25
    private function setCompilerCacheWarmer(array $config, ContainerBuilder $container)
71
    {
72 25
        if ($config['definitions']['auto_compile']) {
73 24
            $definition = $container->setDefinition(
74 24
                CompileCacheWarmer::class,
75 24
                new Definition(CompileCacheWarmer::class)
76
            );
77 24
            $definition->setArguments([new Reference($this->getAlias().'.cache_compiler')]);
78 24
            $definition->addTag('kernel.cache_warmer', ['priority' => 50]);
79
        }
80 25
    }
81
82 25
    private function setClassLoaderListener(array $config, ContainerBuilder $container)
83
    {
84 25
        $container->setParameter($this->getAlias().'.use_classloader_listener', $config['definitions']['use_classloader_listener']);
85 25
        if ($config['definitions']['use_classloader_listener']) {
86 24
            $definition = $container->setDefinition(
87 24
                $this->getAlias().'.event_listener.classloader_listener',
88 24
                new Definition(ClassLoaderListener::class)
89
            );
90 24
            $definition->setArguments([new Reference($this->getAlias().'.cache_compiler')]);
91 24
            $definition->addTag('kernel.event_listener', ['event' => 'kernel.request', 'method' => 'load', 'priority' => 255]);
92 24
            $definition->addTag('kernel.event_listener', ['event' => 'console.command', 'method' => 'load', 'priority' => 255]);
93
        }
94 25
    }
95
96 25
    private function setDefinitionParameters(array $config, ContainerBuilder $container)
97
    {
98
        // auto mapping
99 25
        $container->setParameter($this->getAlias().'.auto_mapping.enabled', $config['definitions']['auto_mapping']['enabled']);
100 25
        $container->setParameter($this->getAlias().'.auto_mapping.directories', $config['definitions']['auto_mapping']['directories']);
101
        // generator and config
102 25
        $container->setParameter($this->getAlias().'.default_resolver', $config['definitions']['default_resolver']);
103 25
        $container->setParameter($this->getAlias().'.class_namespace', $config['definitions']['class_namespace']);
104 25
        $container->setParameter($this->getAlias().'.cache_dir', $config['definitions']['cache_dir']);
105 25
    }
106
107 25
    private function setBatchingMethod(array $config, ContainerBuilder $container)
108
    {
109 25
        $container->setParameter($this->getAlias().'.batching_method', $config['batching_method']);
110 25
    }
111
112 25
    private function setExpressionLanguageDefaultParser(ContainerBuilder $container)
113
    {
114 25
        $class = version_compare(Kernel::VERSION, '3.2.0', '>=') ? ArrayAdapter::class : ArrayParserCache::class;
115 25
        $definition = new Definition($class);
116 25
        $definition->setPublic(false);
117 25
        $container->setDefinition($this->getAlias().'.cache_expression_language_parser.default', $definition);
118 25
    }
119
120 25
    private function setShowDebug(array $config, ContainerBuilder $container)
121
    {
122 25
        $container->getDefinition($this->getAlias().'.request_executor')->replaceArgument(4, $config['definitions']['show_debug_info']);
123 25
    }
124
125 25
    private function setConfigBuilders(array $config, ContainerBuilder $container)
126
    {
127 25
        $useObjectToAddResource = method_exists($container, 'addObjectResource');
128 25
        $objectToAddResourceMethod = $useObjectToAddResource ? 'addObjectResource' : 'addClassResource';
129
130 25
        foreach (BuilderProcessor::BUILDER_TYPES as $type) {
131 25
            if (!empty($config['definitions']['builders'][$type])) {
132 1
                foreach ($config['definitions']['builders'][$type] as $params) {
133 1
                    $object = $useObjectToAddResource ? $params['class'] : new \ReflectionClass($params['class']);
134 1
                    $container->$objectToAddResourceMethod($object);
135 25
                    BuilderProcessor::addBuilderClass($params['alias'], $type, $params['class']);
136
                }
137
            }
138
        }
139 25
    }
140
141 25
    private function treatConfigs(array $configs, ContainerBuilder $container, $forceReload = false)
142
    {
143 25
        static $config = null;
144
145 25
        if ($forceReload || null === $config) {
146 25
            $configuration = $this->getConfiguration($configs, $container);
147 25
            $config = $this->processConfiguration($configuration, $configs);
0 ignored issues
show
Bug introduced by
It seems like $configuration defined by $this->getConfiguration($configs, $container) on line 146 can be null; however, Symfony\Component\Depend...:processConfiguration() does not accept null, maybe add an additional type check?

Unless you are absolutely sure that the expression can never be null because of other conditions, we strongly recommend to add an additional type check to your code:

/** @return stdClass|null */
function mayReturnNull() { }

function doesNotAcceptNull(stdClass $x) { }

// With potential error.
function withoutCheck() {
    $x = mayReturnNull();
    doesNotAcceptNull($x); // Potential error here.
}

// Safe - Alternative 1
function withCheck1() {
    $x = mayReturnNull();
    if ( ! $x instanceof stdClass) {
        throw new \LogicException('$x must be defined.');
    }
    doesNotAcceptNull($x);
}

// Safe - Alternative 2
function withCheck2() {
    $x = mayReturnNull();
    if ($x instanceof stdClass) {
        doesNotAcceptNull($x);
    }
}
Loading history...
148
        }
149
150 25
        return $config;
151
    }
152
153 25
    private function setSecurity(array $config, ContainerBuilder $container)
154
    {
155 25
        foreach ($config['security'] as $key => $value) {
156 25
            $container->setParameter(sprintf('%s.%s', $this->getAlias(), $key), $value);
157
        }
158 25
    }
159
160 25
    private function setErrorHandlerArguments(array $config, ContainerBuilder $container)
161
    {
162 25
        $errorHandlerDefinition = $container->getDefinition($this->getAlias().'.error_handler');
163
164 25
        if (isset($config['definitions']['internal_error_message'])) {
165 2
            $errorHandlerDefinition->replaceArgument(0, $config['definitions']['internal_error_message']);
166
        }
167
168 25
        if (isset($config['definitions']['map_exceptions_to_parent'])) {
169 25
            $errorHandlerDefinition->replaceArgument(
170 25
                3,
171 25
                $config['definitions']['map_exceptions_to_parent']
172
            );
173
        }
174
175 25
        if (isset($config['definitions']['exceptions'])) {
176
            $errorHandlerDefinition
177 25
                ->replaceArgument(2, $this->buildExceptionMap($config['definitions']['exceptions']))
178 25
                ->addMethodCall('setUserWarningClass', [$config['definitions']['exceptions']['types']['warnings']])
179 25
                ->addMethodCall('setUserErrorClass', [$config['definitions']['exceptions']['types']['errors']])
180
            ;
181
        }
182 25
    }
183
184 25
    private function setSchemaBuilderArguments(array $config, ContainerBuilder $container)
185
    {
186 25
        $container->getDefinition($this->getAlias().'.schema_builder')
187 25
            ->replaceArgument(1, $config['definitions']['config_validation']);
188 25
    }
189
190 25
    private function setSchemaArguments(array $config, ContainerBuilder $container)
191
    {
192 25
        if (isset($config['definitions']['schema'])) {
193 25
            $executorDefinition = $container->getDefinition($this->getAlias().'.request_executor');
194
195 25
            foreach ($config['definitions']['schema'] as $schemaName => $schemaConfig) {
196 21
                $schemaID = sprintf('%s.schema_%s', $this->getAlias(), $schemaName);
197 21
                $definition = new Definition(Schema::class);
198 21
                $definition->setFactory([new Reference('overblog_graphql.schema_builder'), 'create']);
199 21
                $definition->setArguments([$schemaConfig['query'], $schemaConfig['mutation'], $schemaConfig['subscription']]);
200 21
                $definition->setPublic(false);
201 21
                $container->setDefinition($schemaID, $definition);
202
203 21
                $executorDefinition->addMethodCall('addSchema', [$schemaName, new Reference($schemaID)]);
204
            }
205
        }
206 25
    }
207
208 25
    private function setServicesAliases(array $config, ContainerBuilder $container)
209
    {
210 25
        if (isset($config['services'])) {
211 25
            foreach ($config['services'] as $name => $id) {
212 25
                $alias = sprintf('%s.%s', $this->getAlias(), $name);
213 25
                $container->setAlias($alias, $id);
214
            }
215
        }
216 25
    }
217
218
    /**
219
     * Returns a list of custom exceptions mapped to error/warning classes.
220
     *
221
     * @param array $exceptionConfig
222
     *
223
     * @return array Custom exception map, [exception => UserError/UserWarning]
224
     */
225 25
    private function buildExceptionMap(array $exceptionConfig)
226
    {
227 25
        $exceptionMap = [];
228 25
        $typeMap = $exceptionConfig['types'];
229
230 25
        foreach ($exceptionConfig as $type => $exceptionList) {
231 25
            if ('types' === $type) {
232 25
                continue;
233
            }
234
235 25
            foreach ($exceptionList as $exception) {
236 25
                $exceptionMap[$exception] = $typeMap[$type];
237
            }
238
        }
239
240 25
        return $exceptionMap;
241
    }
242
}
243