Completed
Push — master ( 35bf32...5024d1 )
by Karel
12s
created

src/DependencyInjection/Configuration.php (2 issues)

Severity

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
/*
4
 * This file is part of the FOSElasticaBundle package.
5
 *
6
 * (c) FriendsOfSymfony <http://friendsofsymfony.github.com/>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace FOS\ElasticaBundle\DependencyInjection;
13
14
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
15
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
16
use Symfony\Component\Config\Definition\ConfigurationInterface;
17
18
class Configuration implements ConfigurationInterface
19
{
20
    const SUPPORTED_DRIVERS = ['orm', 'mongodb', 'phpcr'];
21
22
    /**
23
     * If the kernel is running in debug mode.
24
     *
25
     * @var bool
26
     */
27
    private $debug;
28
29 30
    public function __construct($debug)
30
    {
31 30
        $this->debug = $debug;
32 30
    }
33
34
    /**
35
     * Generates the configuration tree.
36
     *
37
     * @return TreeBuilder
38
     */
39 30
    public function getConfigTreeBuilder()
40
    {
41 30
        $treeBuilder = new TreeBuilder('fos_elastica');
42
43 30
        if (method_exists($treeBuilder, 'getRootNode')) {
44 30
            $rootNode = $treeBuilder->getRootNode();
45
        } else {
46
            // BC layer for symfony/config 4.1 and older
47
            $rootNode = $treeBuilder->root('fos_elastica');
48
        }
49
50 30
        $this->addClientsSection($rootNode);
0 ignored issues
show
$rootNode of type object<Symfony\Component...Builder\NodeDefinition> is not a sub-type of object<Symfony\Component...er\ArrayNodeDefinition>. It seems like you assume a child class of the class Symfony\Component\Config...\Builder\NodeDefinition to be always present.

This check looks for parameters that are defined as one type in their type hint or doc comment but seem to be used as a narrower type, i.e an implementation of an interface or a subclass.

Consider changing the type of the parameter or doing an instanceof check before assuming your parameter is of the expected type.

Loading history...
51 30
        $this->addIndexesSection($rootNode);
0 ignored issues
show
$rootNode of type object<Symfony\Component...Builder\NodeDefinition> is not a sub-type of object<Symfony\Component...er\ArrayNodeDefinition>. It seems like you assume a child class of the class Symfony\Component\Config...\Builder\NodeDefinition to be always present.

This check looks for parameters that are defined as one type in their type hint or doc comment but seem to be used as a narrower type, i.e an implementation of an interface or a subclass.

Consider changing the type of the parameter or doing an instanceof check before assuming your parameter is of the expected type.

Loading history...
52
53
        $rootNode
54 30
            ->children()
55 30
                ->scalarNode('default_client')
56 30
                    ->info('Defaults to the first client defined')
57 30
                ->end()
58 30
                ->scalarNode('default_index')
59 30
                    ->info('Defaults to the first index defined')
60 30
                ->end()
61 30
                ->scalarNode('default_manager')->defaultValue('orm')->end()
62 30
                ->arrayNode('serializer')
63 30
                    ->treatNullLike([])
64 30
                    ->children()
65 30
                        ->scalarNode('callback_class')->defaultValue('FOS\ElasticaBundle\Serializer\Callback')->end()
66 30
                        ->scalarNode('serializer')->defaultValue('serializer')->end()
67 30
                    ->end()
68 30
                ->end()
69 30
            ->end()
70
        ;
71
72 30
        return $treeBuilder;
73
    }
74
75
    /**
76
     * Returns the array node used for "dynamic_templates".
77
     */
78 30
    public function getDynamicTemplateNode()
79
    {
80 30
        $builder = new TreeBuilder();
81 30
        $node = $builder->root('dynamic_templates');
82
83
        $node
84 30
            ->prototype('array')
85 30
                ->prototype('array')
86 30
                    ->children()
87 30
                        ->scalarNode('match')->end()
88 30
                        ->scalarNode('unmatch')->end()
89 30
                        ->scalarNode('match_mapping_type')->end()
90 30
                        ->scalarNode('path_match')->end()
91 30
                        ->scalarNode('path_unmatch')->end()
92 30
                        ->scalarNode('match_pattern')->end()
93 30
                        ->arrayNode('mapping')
94 30
                            ->prototype('variable')
95 30
                                ->treatNullLike([])
96 30
                            ->end()
97 30
                        ->end()
98 30
                    ->end()
99 30
                ->end()
100 30
            ->end()
101
        ;
102
103 30
        return $node;
104
    }
105
106
    /**
107
     * Returns the array node used for "types".
108
     */
109 30
    protected function getTypesNode()
110
    {
111 30
        $builder = new TreeBuilder();
112 30
        $node = $builder->root('types');
113
114
        $node
115 30
            ->useAttributeAsKey('name')
116 30
            ->prototype('array')
117 30
                ->treatNullLike([])
118 30
                ->beforeNormalization()
119 30
                ->ifNull()
120 30
                    ->thenEmptyArray()
121 30
                ->end()
122
                // Support multiple dynamic_template formats to match the old bundle style
123
                // and the way ElasticSearch expects them
124 30
                ->beforeNormalization()
125 30
                ->ifTrue(function ($v) {
126 21
                    return isset($v['dynamic_templates']);
127 30
                })
128 30
                ->then(function ($v) {
129 3
                    $dt = [];
130 3
                    foreach ($v['dynamic_templates'] as $key => $type) {
131 3
                        if (is_int($key)) {
132 3
                            $dt[] = $type;
133
                        } else {
134 3
                            $dt[][$key] = $type;
135
                        }
136
                    }
137
138 3
                    $v['dynamic_templates'] = $dt;
139
140 3
                    return $v;
141 30
                })
142 30
                ->end()
143 30
                ->children()
144 30
                    ->booleanNode('date_detection')->end()
145 30
                    ->arrayNode('dynamic_date_formats')->prototype('scalar')->end()->end()
146 30
                    ->scalarNode('analyzer')->end()
147 30
                    ->booleanNode('numeric_detection')->end()
148 30
                    ->scalarNode('dynamic')->end()
149 30
                    ->variableNode('indexable_callback')->end()
150 30
                    ->append($this->getPersistenceNode())
151 30
                    ->append($this->getSerializerNode())
152 30
                ->end()
153 30
                ->append($this->getIdNode())
154 30
                ->append($this->getPropertiesNode())
155 30
                ->append($this->getDynamicTemplateNode())
156 30
                ->append($this->getSourceNode())
157 30
                ->append($this->getRoutingNode())
158 30
                ->append($this->getParentNode())
159 30
                ->append($this->getAllNode())
160 30
            ->end()
161
        ;
162
163 30
        return $node;
164
    }
165
166
    /**
167
     * Returns the array node used for "properties".
168
     */
169 30
    protected function getPropertiesNode()
170
    {
171 30
        $builder = new TreeBuilder();
172 30
        $node = $builder->root('properties');
173
174
        $node
175 30
            ->useAttributeAsKey('name')
176 30
            ->prototype('variable')
177 30
                ->treatNullLike([]);
178
179 30
        return $node;
180
    }
181
182
    /**
183
     * Returns the array node used for "_id".
184
     */
185 30 View Code Duplication
    protected function getIdNode()
186
    {
187 30
        $builder = new TreeBuilder();
188 30
        $node = $builder->root('_id');
189
190
        $node
191 30
            ->children()
192 30
            ->scalarNode('path')->end()
193 30
            ->end()
194
        ;
195
196 30
        return $node;
197
    }
198
199
    /**
200
     * Returns the array node used for "_source".
201
     */
202 30
    protected function getSourceNode()
203
    {
204 30
        $builder = new TreeBuilder();
205 30
        $node = $builder->root('_source');
206
207
        $node
208 30
            ->children()
209 30
                ->arrayNode('excludes')
210 30
                    ->useAttributeAsKey('name')
211 30
                    ->prototype('scalar')->end()
212 30
                ->end()
213 30
                ->arrayNode('includes')
214 30
                    ->useAttributeAsKey('name')
215 30
                    ->prototype('scalar')->end()
216 30
                ->end()
217 30
                ->scalarNode('compress')->end()
218 30
                ->scalarNode('compress_threshold')->end()
219 30
                ->scalarNode('enabled')->defaultTrue()->end()
220 30
            ->end()
221
        ;
222
223 30
        return $node;
224
    }
225
226
    /**
227
     * Returns the array node used for "_routing".
228
     */
229 30 View Code Duplication
    protected function getRoutingNode()
230
    {
231 30
        $builder = new TreeBuilder();
232 30
        $node = $builder->root('_routing');
233
234
        $node
235 30
            ->children()
236 30
                ->scalarNode('required')->end()
237 30
                ->scalarNode('path')->end()
238 30
            ->end()
239
        ;
240
241 30
        return $node;
242
    }
243
244
    /**
245
     * Returns the array node used for "_parent".
246
     */
247 30
    protected function getParentNode()
248
    {
249 30
        $builder = new TreeBuilder();
250 30
        $node = $builder->root('_parent');
251
252
        $node
253 30
            ->children()
254 30
                ->scalarNode('type')->end()
255 30
                ->scalarNode('property')->defaultValue(null)->end()
256 30
                ->scalarNode('identifier')->defaultValue('id')->end()
257 30
            ->end()
258
        ;
259
260 30
        return $node;
261
    }
262
263
    /**
264
     * Returns the array node used for "_all".
265
     */
266 30
    protected function getAllNode()
267
    {
268 30
        $builder = new TreeBuilder();
269 30
        $node = $builder->root('_all');
270
271
        $node
272 30
            ->children()
273 30
            ->scalarNode('enabled')->defaultValue(true)->end()
274 30
            ->scalarNode('analyzer')->end()
275 30
            ->end()
276
        ;
277
278 30
        return $node;
279
    }
280
281
    /**
282
     * @return ArrayNodeDefinition|\Symfony\Component\Config\Definition\Builder\NodeDefinition
283
     */
284 30
    protected function getPersistenceNode()
285
    {
286 30
        $builder = new TreeBuilder();
287 30
        $node = $builder->root('persistence');
288
289
        $node
290 30
            ->validate()
291 30
                ->ifTrue(function ($v) {
292 17
                    return isset($v['driver']) && 'orm' !== $v['driver'] && !empty($v['elastica_to_model_transformer']['hints']);
293 30
                })
294 30
                    ->thenInvalid('Hints are only supported by the "orm" driver')
295 30
            ->end()
296 30
            ->children()
297 30
                ->scalarNode('driver')
298 30
                    ->defaultValue('orm')
299 30
                    ->validate()
300 30
                    ->ifNotInArray(self::SUPPORTED_DRIVERS)
301 30
                        ->thenInvalid('The driver %s is not supported. Please choose one of '.json_encode(self::SUPPORTED_DRIVERS))
302 30
                    ->end()
303 30
                ->end()
304 30
                ->scalarNode('model')->defaultValue(null)->end()
305 30
                ->scalarNode('repository')->end()
306 30
                ->scalarNode('identifier')->defaultValue('id')->end()
307 30
                ->arrayNode('provider')
308 30
                    ->addDefaultsIfNotSet()
309 30
                    ->children()
310 30
                        ->scalarNode('batch_size')->defaultValue(100)->end()
311 30
                        ->scalarNode('clear_object_manager')->defaultTrue()->end()
312 30
                        ->scalarNode('debug_logging')
313 30
                            ->defaultValue($this->debug)
314 30
                            ->treatNullLike(true)
315 30
                        ->end()
316 30
                        ->scalarNode('query_builder_method')->defaultValue('createQueryBuilder')->end()
317 30
                        ->scalarNode('service')->end()
318 30
                    ->end()
319 30
                ->end()
320 30
                ->arrayNode('listener')
321 30
                    ->addDefaultsIfNotSet()
322 30
                    ->children()
323 30
                        ->booleanNode('enabled')->defaultTrue()->end()
324 30
                        ->scalarNode('insert')->defaultTrue()->end()
325 30
                        ->scalarNode('update')->defaultTrue()->end()
326 30
                        ->scalarNode('delete')->defaultTrue()->end()
327 30
                        ->scalarNode('flush')->defaultTrue()->end()
328 30
                        ->booleanNode('defer')->defaultFalse()->end()
329 30
                        ->scalarNode('logger')
330 30
                            ->defaultFalse()
331 30
                            ->treatNullLike('fos_elastica.logger')
332 30
                            ->treatTrueLike('fos_elastica.logger')
333 30
                        ->end()
334 30
                        ->scalarNode('service')->end()
335 30
                    ->end()
336 30
                ->end()
337 30
                ->arrayNode('finder')
338 30
                    ->addDefaultsIfNotSet()
339 30
                    ->children()
340 30
                        ->scalarNode('service')->end()
341 30
                    ->end()
342 30
                ->end()
343 30
                ->arrayNode('elastica_to_model_transformer')
344 30
                    ->addDefaultsIfNotSet()
345 30
                    ->children()
346 30
                        ->arrayNode('hints')
347 30
                            ->prototype('array')
348 30
                                ->children()
349 30
                                    ->scalarNode('name')->end()
350 30
                                    ->scalarNode('value')->end()
351 30
                                ->end()
352 30
                            ->end()
353 30
                        ->end()
354 30
                        ->booleanNode('hydrate')->defaultTrue()->end()
355 30
                        ->booleanNode('ignore_missing')
356 30
                            ->defaultFalse()
357 30
                            ->info('Silently ignore results returned from Elasticsearch without corresponding persistent object.')
358 30
                        ->end()
359 30
                        ->scalarNode('query_builder_method')->defaultValue('createQueryBuilder')->end()
360 30
                        ->scalarNode('service')->end()
361 30
                    ->end()
362 30
                ->end()
363 30
                ->arrayNode('model_to_elastica_transformer')
364 30
                    ->addDefaultsIfNotSet()
365 30
                    ->children()
366 30
                        ->scalarNode('service')->end()
367 30
                    ->end()
368 30
                ->end()
369 30
                ->arrayNode('persister')
370 30
                    ->addDefaultsIfNotSet()
371 30
                    ->children()
372 30
                        ->enumNode('refresh')
373 30
                            ->treatTrueLike('true')
374 30
                            ->treatFalseLike('false')
375 30
                            ->values(['true', 'wait_for', 'false'])
376 30
                        ->end()
377 30
                        ->scalarNode('service')->end()
378 30
                    ->end()
379 30
                ->end()
380 30
            ->end();
381
382 30
        return $node;
383
    }
384
385
    /**
386
     * @return ArrayNodeDefinition|\Symfony\Component\Config\Definition\Builder\NodeDefinition
387
     */
388 30
    protected function getSerializerNode()
389
    {
390 30
        $builder = new TreeBuilder();
391 30
        $node = $builder->root('serializer');
392
393
        $node
394 30
            ->addDefaultsIfNotSet()
395 30
            ->children()
396 30
                ->arrayNode('groups')
397 30
                    ->treatNullLike([])
398 30
                    ->prototype('scalar')->end()
399 30
                ->end()
400 30
                ->scalarNode('version')->end()
401 30
                ->booleanNode('serialize_null')
402 30
                    ->defaultFalse()
403 30
                ->end()
404 30
            ->end();
405
406 30
        return $node;
407
    }
408
409
    /**
410
     * Adds the configuration for the "clients" key.
411
     */
412 30
    private function addClientsSection(ArrayNodeDefinition $rootNode)
413
    {
414
        $rootNode
415 30
            ->fixXmlConfig('client')
416 30
            ->children()
417 30
                ->arrayNode('clients')
418 30
                    ->useAttributeAsKey('id')
419 30
                    ->prototype('array')
420 30
                        ->performNoDeepMerging()
421
                        // Elastica names its properties with camel case, support both
422 30
                        ->beforeNormalization()
423 30
                        ->ifTrue(function ($v) {
424 29
                            return isset($v['connection_strategy']);
425 30
                        })
426 30
                        ->then(function ($v) {
427 3
                            $v['connectionStrategy'] = $v['connection_strategy'];
428 3
                            unset($v['connection_strategy']);
429
430 3
                            return $v;
431 30
                        })
432 30
                        ->end()
433
                        // If there is no connections array key defined, assume a single connection.
434 30
                        ->beforeNormalization()
435 30
                        ->ifTrue(function ($v) {
436 29
                            return is_array($v) && !array_key_exists('connections', $v);
437 30
                        })
438 30
                        ->then(function ($v) {
439
                            return [
440 29
                                'connections' => [$v],
441
                            ];
442 30
                        })
443 30
                        ->end()
444 30
                        ->children()
445 30
                            ->arrayNode('connections')
446 30
                                ->requiresAtLeastOneElement()
447 30
                                ->prototype('array')
448 30
                                    ->fixXmlConfig('header')
449 30
                                    ->children()
450 30
                                        ->scalarNode('url')
451 30
                                            ->validate()
452 30
                                                ->ifTrue(function ($url) {
453 17
                                                    return $url && '/' !== substr($url, -1);
454 30
                                                })
455 30
                                                ->then(function ($url) {
456 17
                                                    return $url.'/';
457 30
                                                })
458 30
                                            ->end()
459 30
                                        ->end()
460 30
                                        ->scalarNode('username')->end()
461 30
                                        ->scalarNode('password')->end()
462 30
                                        ->scalarNode('host')->end()
463 30
                                        ->scalarNode('port')->end()
464 30
                                        ->scalarNode('proxy')->end()
465 30
                                        ->scalarNode('aws_access_key_id')->end()
466 30
                                        ->scalarNode('aws_secret_access_key')->end()
467 30
                                        ->scalarNode('aws_region')->end()
468 30
                                        ->scalarNode('aws_session_token')->end()
469 30
                                        ->booleanNode('ssl')->defaultValue(false)->end()
470 30
                                        ->scalarNode('logger')
471 30
                                            ->defaultValue($this->debug ? 'fos_elastica.logger' : false)
472 30
                                            ->treatNullLike('fos_elastica.logger')
473 30
                                            ->treatTrueLike('fos_elastica.logger')
474 30
                                        ->end()
475 30
                                        ->booleanNode('compression')->defaultValue(false)->end()
476 30
                                        ->arrayNode('headers')
477 30
                                            ->normalizeKeys(false)
478 30
                                            ->useAttributeAsKey('name')
479 30
                                            ->prototype('scalar')->end()
480 30
                                        ->end()
481 30
                                        ->arrayNode('curl')
482 30
                                            ->useAttributeAsKey(CURLOPT_SSL_VERIFYPEER)
483 30
                                            ->prototype('boolean')->end()
484 30
                                        ->end()
485 30
                                        ->scalarNode('transport')->end()
486 30
                                        ->scalarNode('timeout')->end()
487 30
                                        ->scalarNode('connectTimeout')->end()
488 30
                                        ->scalarNode('retryOnConflict')
489 30
                                            ->defaultValue(0)
490 30
                                        ->end()
491 30
                                    ->end()
492 30
                                ->end()
493 30
                            ->end()
494 30
                            ->scalarNode('timeout')->end()
495 30
                            ->scalarNode('connectTimeout')->end()
496 30
                            ->scalarNode('headers')->end()
497 30
                            ->scalarNode('connectionStrategy')->defaultValue('Simple')->end()
498 30
                        ->end()
499 30
                    ->end()
500 30
                ->end()
501 30
            ->end()
502
        ;
503 30
    }
504
505
    /**
506
     * Adds the configuration for the "indexes" key.
507
     */
508 30
    private function addIndexesSection(ArrayNodeDefinition $rootNode)
509
    {
510
        $rootNode
511 30
            ->fixXmlConfig('index')
512 30
            ->children()
513 30
                ->arrayNode('indexes')
514 30
                    ->useAttributeAsKey('name')
515 30
                    ->prototype('array')
516 30
                        ->children()
517 30
                            ->scalarNode('index_name')
518 30
                                ->info('Defaults to the name of the index, but can be modified if the index name is different in ElasticSearch')
519 30
                            ->end()
520 30
                            ->booleanNode('use_alias')->defaultValue(false)->end()
521 30
                            ->scalarNode('client')->end()
522 30
                            ->scalarNode('finder')
523 30
                                ->treatNullLike(true)
524 30
                                ->defaultFalse()
525 30
                            ->end()
526 30
                            ->arrayNode('type_prototype')
527 30
                                ->children()
528 30
                                    ->scalarNode('analyzer')->end()
529 30
                                    ->append($this->getPersistenceNode())
530 30
                                    ->append($this->getSerializerNode())
531 30
                                ->end()
532 30
                            ->end()
533 30
                            ->variableNode('settings')->defaultValue([])->end()
534 30
                        ->end()
535 30
                        ->append($this->getTypesNode())
536 30
                    ->end()
537 30
                ->end()
538 30
            ->end()
539
        ;
540 30
    }
541
}
542