TranslationExtension::handleConfigNode()   B
last analyzed

Complexity

Conditions 10
Paths 75

Size

Total Lines 57
Code Lines 36

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 33
CRAP Score 10.1263

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 10
eloc 36
c 2
b 0
f 0
nc 75
nop 2
dl 0
loc 57
ccs 33
cts 37
cp 0.8919
crap 10.1263
rs 7.6666

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
/*
4
 * This file is part of the PHP Translation package.
5
 *
6
 * (c) PHP Translation team <[email protected]>
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 Translation\Bundle\DependencyInjection;
13
14
use Symfony\Component\Config\FileLocator;
15
use Symfony\Component\DependencyInjection\Alias;
16
use Symfony\Component\DependencyInjection\ChildDefinition;
17
use Symfony\Component\DependencyInjection\ContainerBuilder;
18
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
19
use Symfony\Component\DependencyInjection\Loader;
20
use Symfony\Component\DependencyInjection\Reference;
21
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
22
use Symfony\Component\HttpKernel\Kernel;
23
use Translation\Bundle\EventListener\AutoAddMissingTranslations;
24
use Translation\Bundle\EventListener\EditInPlaceResponseListener;
25
use Translation\Bundle\Model\Configuration as ConfigurationModel;
26
use Translation\Bundle\Service\ConfigurationManager;
27
use Translation\Bundle\Service\StorageManager;
28
use Translation\Bundle\Service\StorageService;
29
use Translation\Bundle\Translator\EditInPlaceTranslator;
30
use Translation\Bundle\Twig\EditInPlaceExtension;
31
use Translation\Extractor\Visitor\Php\Symfony\FormTypeChoices;
32
33
/**
34
 * This is the class that loads and manages your bundle configuration.
35
 *
36
 * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html}
37
 */
38
class TranslationExtension extends Extension
39
{
40
    /**
41
     * {@inheritdoc}
42
     */
43 8
    public function load(array $configs, ContainerBuilder $container): void
44
    {
45 8
        $container->setParameter('extractor_vendor_dir', $this->getExtractorVendorDirectory());
46
47 8
        $configuration = new Configuration($container);
48 8
        $config = $this->processConfiguration($configuration, $configs);
49 8
        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
50
51 8
        $loader->load('services.yaml');
52 8
        $loader->load('extractors.yaml');
53
54
        // Add major version to extractor
55 8
        $container->getDefinition(FormTypeChoices::class)
56 8
            ->addMethodCall('setSymfonyMajorVersion', [Kernel::MAJOR_VERSION]);
57
58 8
        $container->setParameter('php_translation.locales', $config['locales']);
59 8
        $container->setParameter('php_translation.default_locale',
60 8
            $config['default_locale'] ?? $container->getParameter('kernel.default_locale'));
61 8
        $this->handleConfigNode($container, $config);
62
63 8
        if ($config['webui']['enabled']) {
64 1
            $loader->load('webui.yaml');
65 1
            $this->enableWebUi($container, $config);
66
        } else {
67 7
            $container->setParameter('php_translation.webui.enabled', false);
68
        }
69
70 8
        if ($config['symfony_profiler']['enabled']) {
71 1
            $loader->load('symfony_profiler.yaml');
72 1
            $this->enableSymfonyProfiler($container, $config);
73
        }
74
75 8
        if ($config['edit_in_place']['enabled']) {
76 1
            $loader->load('edit_in_place.yaml');
77 1
            $this->enableEditInPlace($container, $config);
78
        }
79
80 8
        if ($config['auto_add_missing_translations']['enabled']) {
81 1
            $loader->load('auto_add.yaml');
82 1
            $container->getDefinition(AutoAddMissingTranslations::class)
83 1
                ->replaceArgument(0, new Reference('php_translation.storage.'.$config['auto_add_missing_translations']['config_name']));
84
        }
85
86 8
        if ($config['fallback_translation']['enabled']) {
87 1
            $loader->load('auto_translation.yaml');
88 1
            $this->enableFallbackAutoTranslator($container, $config);
89
        }
90
91 8
        $loader->load('console.yaml');
92 8
    }
93
94
    /**
95
     * Handle the config node to prepare the config manager.
96
     */
97 8
    private function handleConfigNode(ContainerBuilder $container, array $config): void
98
    {
99 8
        $container->resolveEnvPlaceholders($config);
100 8
        $storageManager = $container->getDefinition(StorageManager::class);
101 8
        $configurationManager = $container->getDefinition(ConfigurationManager::class);
102
        // $first will be the "default" configuration.
103 8
        $first = null;
104 8
        foreach ($config['configs'] as $name => &$c) {
105 8
            if (null === $first || 'default' === $name) {
106 8
                $first = $name;
107
            }
108 8
            if (empty($c['project_root'])) {
109
                // Add a project root of none is set.
110 8
                $c['project_root'] = \dirname($container->getParameter('kernel.project_dir'));
111
            }
112 8
            $c['name'] = $name;
113 8
            $c['locales'] = $config['locales'];
114 8
            $configurationServiceId = 'php_translation.configuration.'.$name;
115 8
            $configDef = $container->register($configurationServiceId, ConfigurationModel::class);
116 8
            $configDef->setPublic(false)->addArgument($c);
117 8
            $configurationManager->addMethodCall('addConfiguration', [$name, new Reference($configurationServiceId)]);
118
119
            /*
120
             * Configure storage chain service
121
             */
122 8
            $storageDefinition = new ChildDefinition('php_translation.storage.abstract');
123 8
            $storageDefinition->replaceArgument(1, new Reference($configurationServiceId));
124 8
            $storageDefinition->setPublic(true);
125 8
            $container->setDefinition('php_translation.storage.'.$name, $storageDefinition);
126 8
            $storageManager->addMethodCall('addStorage', [$name, new Reference('php_translation.storage.'.$name)]);
127
128
            // Add storages
129 8
            foreach ($c['remote_storage'] as $serviceId) {
130
                $storageDefinition->addMethodCall('addRemoteStorage', [new Reference($serviceId)]);
131
            }
132
133 8
            foreach ($c['local_storage'] as $serviceId) {
134 8
                if ('php_translation.local_file_storage.abstract' !== $serviceId) {
135
                    $storageDefinition->addMethodCall('addLocalStorage', [new Reference($serviceId)]);
136
137
                    continue;
138
                }
139
140 8
                $def = new ChildDefinition($serviceId);
141 8
                $def->replaceArgument(2, [$c['output_dir']])
142 8
                    ->replaceArgument(3, $c['local_file_storage_options'])
143 8
                    ->addTag('php_translation.storage', ['type' => 'local', 'name' => $name]);
144 8
                $container->setDefinition('php_translation.single_storage.file.'.$name, $def);
145
            }
146
        }
147
148 8
        if (null !== $first) {
149
            // Create some aliases for the default storage
150 8
            $container->setAlias('php_translation.storage', new Alias('php_translation.storage.'.$first, true));
151 8
            $container->setAlias(StorageService::class, new Alias('php_translation.storage', true));
152 8
            if ('default' !== $first) {
153
                $container->setAlias('php_translation.storage.default', new Alias('php_translation.storage.'.$first, true));
154
            }
155
        }
156 8
    }
157
158
    /**
159
     * Handle config for WebUI.
160
     */
161 1
    private function enableWebUi(ContainerBuilder $container, array $config): void
162
    {
163 1
        $container->setParameter('php_translation.webui.enabled', true);
164 1
        $container->setParameter('php_translation.webui.allow_create', $config['webui']['allow_create']);
165 1
        $container->setParameter('php_translation.webui.allow_delete', $config['webui']['allow_delete']);
166
167 1
        $path = $config['webui']['file_base_path'];
168 1
        if (null === $path) {
169 1
            $path = $container->getParameter('kernel.project_dir');
170
        }
171
172 1
        $container->setParameter('php_translation.webui.file_base_path', \rtrim($path, '/').'/');
173 1
    }
174
175
    /**
176
     * Handle config for EditInPlace.
177
     */
178 1
    private function enableEditInPlace(ContainerBuilder $container, array $config): void
179
    {
180 1
        $name = $config['edit_in_place']['config_name'];
181
182 1
        if ('default' !== $name && !isset($config['configs'][$name])) {
183
            throw new InvalidArgumentException(\sprintf('There is no config named "%s".', $name));
184
        }
185
186 1
        $activatorRef = new Reference($config['edit_in_place']['activator']);
187
188 1
        $def = $container->getDefinition(EditInPlaceResponseListener::class);
189 1
        $def->replaceArgument(0, $activatorRef);
190 1
        $def->replaceArgument(3, $name);
191 1
        $def->replaceArgument(4, $config['edit_in_place']['show_untranslatable']);
192
193 1
        $def = $container->getDefinition(EditInPlaceTranslator::class);
194 1
        $def->replaceArgument(1, $activatorRef);
195
196 1
        $def = $container->getDefinition(EditInPlaceExtension::class);
197 1
        $def->replaceArgument(2, $activatorRef);
198 1
    }
199
200
    /**
201
     * Handle config for Symfony Profiler.
202
     */
203 1
    private function enableSymfonyProfiler(ContainerBuilder $container, array $config): void
204
    {
205 1
        $container->setParameter('php_translation.toolbar.allow_edit', $config['symfony_profiler']['allow_edit']);
206 1
    }
207
208
    /**
209
     * Handle config for fallback auto translate.
210
     */
211 1
    private function enableFallbackAutoTranslator(ContainerBuilder $container, array $config): void
212
    {
213 1
        $externalTranslatorId = 'php_translation.translator_service.'.$config['fallback_translation']['service'];
214 1
        $externalTranslatorDef = $container->getDefinition($externalTranslatorId);
215 1
        $externalTranslatorDef->addTag('php_translation.external_translator');
216 1
        $externalTranslatorDef->addArgument(new Reference($config['http_client']));
217 1
        $externalTranslatorDef->addArgument(new Reference($config['message_factory']));
218
219 1
        $container->setParameter('php_translation.translator_service.api_key', $config['fallback_translation']['api_key']);
220 1
    }
221
222
    /**
223
     * {@inheritdoc}
224
     */
225 8
    public function getAlias(): string
226
    {
227 8
        return 'translation';
228
    }
229
230
    /**
231
     * {@inheritdoc}
232
     */
233
    public function getConfiguration(array $config, ContainerBuilder $container): Configuration
234
    {
235
        return new Configuration($container);
236
    }
237
238 8
    private function getExtractorVendorDirectory(): string
239
    {
240 8
        $vendorReflection = new \ReflectionClass(FormTypeChoices::class);
241
242 8
        return \dirname($vendorReflection->getFileName(), 4);
243
    }
244
}
245