Completed
Push — master ( 6f2f7b...0abd1b )
by Kamil
16s
created

SyliusSearchExtension   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 94
Duplicated Lines 0 %

Coupling/Cohesion

Components 2
Dependencies 9

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 10
lcom 2
cbo 9
dl 0
loc 94
rs 10
c 1
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
B load() 0 24 1
A prepend() 0 5 1
A prependDoctrineOrm() 0 20 2
B prependElasticaProductListener() 0 27 6
1
<?php
2
3
/*
4
 * This file is part of the Sylius package.
5
 *
6
 * (c) Paweł Jędrzejewski
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 Sylius\Bundle\SearchBundle\DependencyInjection;
13
14
use FOS\ElasticaBundle\DependencyInjection\Configuration as FosElasticaConfiguration;
15
use Sylius\Bundle\ResourceBundle\DependencyInjection\Extension\AbstractResourceExtension;
16
use Sylius\Bundle\SearchBundle\DependencyInjection\Configuration as SyliusSearchConfiguration;
17
use Sylius\Bundle\SearchBundle\Extension\Doctrine\MatchAgainstFunction;
18
use Sylius\Bundle\SearchBundle\Listener\ElasticaProductListener;
19
use Symfony\Component\Config\Definition\Processor;
20
use Symfony\Component\Config\FileLocator;
21
use Symfony\Component\DependencyInjection\ContainerBuilder;
22
use Symfony\Component\DependencyInjection\Definition;
23
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
24
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
25
use Symfony\Component\DependencyInjection\Reference;
26
27
/**
28
 * @author Argyrios Gounaris <[email protected]>
29
 */
30
class SyliusSearchExtension extends AbstractResourceExtension implements PrependExtensionInterface
31
{
32
    /**
33
     * {@inheritdoc}
34
     */
35
    public function load(array $config, ContainerBuilder $container)
36
    {
37
        $config = $this->processConfiguration($this->getConfiguration($config, $container), $config);
0 ignored issues
show
Documentation introduced by
$this->getConfiguration($config, $container) is of type object|null, but the function expects a object<Symfony\Component...ConfigurationInterface>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
38
        $loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
39
40
        $this->registerResources('sylius', $config['driver'], $config['resources'], $container);
41
42
        $loader->load('services.xml');
43
44
        $container->setParameter('sylius_search.config', $config);
45
46
        $container->setAlias('sylius_search.command.indexer', sprintf('sylius.search.%s.indexer', ucfirst($config['engine'])));
47
        $container->setAlias('sylius_search.finder', sprintf('sylius_search.%s.finder', ucfirst($config['engine'])));
48
49
        $container->setAlias('sylius_search.query.logger', sprintf('sylius_search.%s.query.logger', ucfirst($config['query_logger']['engine'])));
50
        $container->setParameter('sylius_search.query.logger.enabled', $config['query_logger']['enabled']);
51
52
        $container->setParameter('sylius_search.request.method', $config['request_method']);
53
        $container->setParameter('sylius_search.search.template', $config['search_form_template']);
54
        $container->setParameter('sylius_search.pre_search_filter.enabled', $config['filters']['pre_search_filter']['enabled']);
55
        $container->setParameter('sylius_search.pre_search_filter.taxon', $config['filters']['pre_search_filter']['taxon']);
56
57
        $container->setParameter('sylius_search.custom.accessor.class', $config['custom_accessor']);
58
    }
59
60
    /**
61
     * {@inheritdoc}
62
     */
63
    public function prepend(ContainerBuilder $container)
64
    {
65
        $this->prependElasticaProductListener($container);
66
        $this->prependDoctrineOrm($container);
67
    }
68
69
    /**
70
     * @param ContainerBuilder $container
71
     */
72
    private function prependElasticaProductListener(ContainerBuilder $container)
73
    {
74
        if (!$container->hasExtension('fos_elastica') || !$container->hasExtension('sylius_search')) {
75
            return;
76
        }
77
78
        $configuration = new SyliusSearchConfiguration();
79
        $processor = new Processor();
80
        $syliusSearchConfig = $processor->processConfiguration($configuration, $container->getExtensionConfig('sylius_search'));
81
        $engine = $syliusSearchConfig['engine'];
82
83
        if ($engine === 'elasticsearch') {
84
            $configuration = new FosElasticaConfiguration(false);
85
            $processor = new Processor();
86
            $elasticaConfig = $processor->processConfiguration($configuration, $container->getExtensionConfig('fos_elastica'));
87
88
            foreach ($elasticaConfig['indexes'] as $index => $config) {
89
                if (array_key_exists('product', $config['types'])) {
90
                    $elasticaProductListenerDefinition = new Definition(ElasticaProductListener::class);
91
                    $elasticaProductListenerDefinition->addArgument(new Reference('fos_elastica.object_persister.' . $index . '.product'));
92
                    $elasticaProductListenerDefinition->addTag('doctrine.event_subscriber');
93
94
                    $container->setDefinition('sylius_product.listener.index_' . $index . '.product_update', $elasticaProductListenerDefinition);
95
                }
96
            }
97
        }
98
    }
99
100
    /**
101
     * @param ContainerBuilder $container
102
     */
103
    private function prependDoctrineOrm(ContainerBuilder $container)
104
    {
105
        if (!$container->hasExtension('doctrine')) {
106
            return;
107
        }
108
109
        $container->prependExtensionConfig('doctrine', [
110
            'orm' => [
111
                'entity_managers' => [
112
                    'default' => [
113
                        'dql' => [
114
                            'string_functions' => [
115
                                'MATCH' => MatchAgainstFunction::class,
116
                            ],
117
                        ],
118
                    ],
119
                ],
120
            ],
121
        ]);
122
    }
123
}
124