Completed
Push — master ( 740372...dc5b6e )
by Tobias
10:09
created

TranslationExtension   A

Complexity

Total Complexity 24

Size/Duplication

Total Lines 186
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 9

Test Coverage

Coverage 96.12%

Importance

Changes 0
Metric Value
wmc 24
lcom 1
cbo 9
dl 0
loc 186
ccs 99
cts 103
cp 0.9612
rs 10
c 0
b 0
f 0

7 Methods

Rating   Name   Duplication   Size   Complexity  
C load() 0 44 7
A enableWebUi() 0 6 1
A enableEditInPlace() 0 18 3
A enableSymfonyProfiler() 0 4 1
A enableFallbackAutoTranslator() 0 10 1
A getAlias() 0 4 1
C handleConfigNode() 0 55 10
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\DependencyInjection\ContainerBuilder;
15
use Symfony\Component\Config\FileLocator;
16
use Symfony\Component\DependencyInjection\DefinitionDecorator;
17
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
18
use Symfony\Component\DependencyInjection\Reference;
19
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
20
use Symfony\Component\DependencyInjection\Loader;
21
use Symfony\Component\HttpKernel\Kernel;
22
use Translation\Bundle\Model\Configuration as ConfigurationModel;
23
24
/**
25
 * This is the class that loads and manages your bundle configuration.
26
 *
27
 * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html}
28
 */
29
class TranslationExtension extends Extension
30
{
31
    /**
32
     * {@inheritdoc}
33
     */
34 17
    public function load(array $configs, ContainerBuilder $container)
35
    {
36 17
        $configuration = new Configuration($container);
37 17
        $config = $this->processConfiguration($configuration, $configs);
38 17
        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
39
40 17
        $loader->load('services.yml');
41 17
        $loader->load('extractors.yml');
42
43
        // Add major version to extractor
44 17
        $container->getDefinition('php_translation.extractor.php.visitor.FormTypeChoices')
45 17
            ->addMethodCall('setSymfonyMajorVersion', [Kernel::MAJOR_VERSION]);
46
47 17
        $container->setParameter('php_translation.locales', $config['locales']);
48 17
        $container->setParameter('php_translation.default_locale', isset($config['default_locale']) ? $config['default_locale'] : $container->getParameter('kernel.default_locale'));
49 17
        $this->handleConfigNode($container, $config);
50
51 17
        if ($config['webui']['enabled']) {
52 10
            $this->enableWebUi($container, $config);
53 10
        } else {
54 7
            $container->setParameter('php_translation.webui.enabled', false);
55
        }
56
57 17
        if ($config['symfony_profiler']['enabled']) {
58 17
            $loader->load('symfony_profiler.yml');
59 17
            $this->enableSymfonyProfiler($container, $config);
60 17
        }
61
62 17
        if ($config['edit_in_place']['enabled']) {
63 10
            $loader->load('edit_in_place.yml');
64 10
            $this->enableEditInPlace($container, $config);
65 10
        }
66
67 17
        if ($config['auto_add_missing_translations']['enabled']) {
68 1
            $loader->load('auto_add.yml');
69 1
            $container->getDefinition('php_translator.auto_adder')
70 1
                ->replaceArgument(0, new Reference('php_translation.storage.'.$config['auto_add_missing_translations']['config_name']));
71 1
        }
72
73 17
        if ($config['fallback_translation']['enabled']) {
74 1
            $loader->load('auto_translation.yml');
75 1
            $this->enableFallbackAutoTranslator($container, $config);
76 1
        }
77 17
    }
78
79
    /**
80
     * Handle the config node to prepare the config manager.
81
     *
82
     * @param ContainerBuilder $container
83
     * @param array            $config
84
     */
85 17
    private function handleConfigNode(ContainerBuilder $container, array $config)
86
    {
87 17
        $configurationManager = $container->getDefinition('php_translation.configuration_manager');
88
        // $first will be the "default" configuration.
89 17
        $first = null;
90 17
        foreach ($config['configs'] as $name => &$c) {
91 17
            if ($first === null || $name === 'default') {
92 17
                $first = $name;
93 17
            }
94 17
            if (empty($c['project_root'])) {
95
                // Add a project root of none is set.
96 17
                $c['project_root'] = dirname($container->getParameter('kernel.root_dir'));
97 17
            }
98 17
            $c['name'] = $name;
99 17
            $c['locales'] = $config['locales'];
100 17
            $configurationServiceId = 'php_translation.configuration.'.$name;
101 17
            $configDef = $container->register($configurationServiceId, ConfigurationModel::class);
102 17
            $configDef->setPublic(false)->addArgument($c);
103 17
            $configurationManager->addMethodCall('addConfiguration', [$name, new Reference($configurationServiceId)]);
104
105
            /*
106
             * Configure storage chain service
107
             */
108 17
            $storageDefinition = new DefinitionDecorator('php_translation.storage.abstract');
0 ignored issues
show
Deprecated Code introduced by
The class Symfony\Component\Depend...ion\DefinitionDecorator has been deprecated with message: The DefinitionDecorator class is deprecated since version 3.3 and will be removed in 4.0. Use the Symfony\Component\DependencyInjection\ChildDefinition class instead.

This class, trait or interface has been deprecated. The supplier of the file has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the type will be removed from the class and what other constant to use instead.

Loading history...
109 17
            $storageDefinition->replaceArgument(2, new Reference($configurationServiceId));
110 17
            $container->setDefinition('php_translation.storage.'.$name, $storageDefinition);
111
112
            // Add storages
113 17
            foreach ($c['remote_storage'] as $serviceId) {
114
                $storageDefinition->addMethodCall('addRemoteStorage', [new Reference($serviceId)]);
115 17
            }
116
117 17
            foreach ($c['local_storage'] as $serviceId) {
118 17
                if ($serviceId !== 'php_translation.local_file_storage.abstract') {
119
                    $storageDefinition->addMethodCall('addLocalStorage', [new Reference($serviceId)]);
120
121
                    continue;
122
                }
123
124 17
                $def = new DefinitionDecorator($serviceId);
0 ignored issues
show
Deprecated Code introduced by
The class Symfony\Component\Depend...ion\DefinitionDecorator has been deprecated with message: The DefinitionDecorator class is deprecated since version 3.3 and will be removed in 4.0. Use the Symfony\Component\DependencyInjection\ChildDefinition class instead.

This class, trait or interface has been deprecated. The supplier of the file has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the type will be removed from the class and what other constant to use instead.

Loading history...
125 17
                $def->replaceArgument(2, [$c['output_dir']])
126 17
                    ->replaceArgument(3, [$c['local_file_storage_options']])
127 17
                    ->addTag('php_translation.storage', ['type' => 'local', 'name' => $name]);
128 17
                $container->setDefinition('php_translation.single_storage.file.'.$name, $def);
129 17
            }
130 17
        }
131
132 17
        if ($first !== null) {
133
            // Create some aliases for the default storage
134 17
            $container->setAlias('php_translation.storage', 'php_translation.storage.'.$first);
135 17
            if ($first !== 'default') {
136 5
                $container->setAlias('php_translation.storage.default', 'php_translation.storage.'.$first);
137 5
            }
138 17
        }
139 17
    }
140
141
    /**
142
     * Handle config for WebUI.
143
     *
144
     * @param ContainerBuilder $container
145
     * @param array            $config
146
     */
147 10
    private function enableWebUi(ContainerBuilder $container, array $config)
148
    {
149 10
        $container->setParameter('php_translation.webui.enabled', true);
150 10
        $container->setParameter('php_translation.webui.allow_create', $config['webui']['allow_create']);
151 10
        $container->setParameter('php_translation.webui.allow_delete', $config['webui']['allow_delete']);
152 10
    }
153
154
    /**
155
     * Handle config for EditInPlace.
156
     *
157
     * @param ContainerBuilder $container
158
     * @param array            $config
159
     */
160 10
    private function enableEditInPlace(ContainerBuilder $container, array $config)
161
    {
162 10
        $name = $config['edit_in_place']['config_name'];
163
164 10
        if ($name !== 'default' && !isset($config['configs'][$name])) {
165
            throw new InvalidArgumentException(sprintf('There is no config named "%s".', $name));
166
        }
167
168 10
        $activatorRef = new Reference($config['edit_in_place']['activator']);
169
170 10
        $def = $container->getDefinition('php_translation.edit_in_place.response_listener');
171 10
        $def->replaceArgument(0, $activatorRef);
172 10
        $def->replaceArgument(3, $name);
173 10
        $def->replaceArgument(4, $config['edit_in_place']['show_untranslatable']);
174
175 10
        $def = $container->getDefinition('php_translator.edit_in_place.xtrans_html_translator');
176 10
        $def->replaceArgument(1, $activatorRef);
177 10
    }
178
179
    /**
180
     * Handle config for Symfony Profiler.
181
     *
182
     * @param ContainerBuilder $container
183
     * @param array            $config
184
     */
185 17
    private function enableSymfonyProfiler(ContainerBuilder $container, array $config)
186
    {
187 17
        $container->setParameter('php_translation.toolbar.allow_edit', $config['symfony_profiler']['allow_edit']);
188 17
    }
189
190
    /**
191
     * Handle config for fallback auto translate.
192
     *
193
     * @param ContainerBuilder $container
194
     * @param array            $config
195
     */
196 1
    private function enableFallbackAutoTranslator(ContainerBuilder $container, array $config)
197
    {
198 1
        $externalTranslatorId = 'php_translation.translator_service.'.$config['fallback_translation']['service'];
199 1
        $externalTranslatorDef = $container->getDefinition($externalTranslatorId);
200 1
        $externalTranslatorDef->addTag('php_translation.external_translator');
201 1
        $externalTranslatorDef->addArgument(new Reference($config['http_client']));
202 1
        $externalTranslatorDef->addArgument(new Reference($config['message_factory']));
203
204 1
        $container->setParameter('php_translation.translator_service.api_key', $config['fallback_translation']['api_key']);
205 1
    }
206
207
    /**
208
     * {@inheritdoc}
209
     */
210 17
    public function getAlias()
211
    {
212 17
        return 'translation';
213
    }
214
}
215