Completed
Push — 3.x ( 29ab95...70e1e4 )
by Grégoire
03:01
created

SonataAdminExtension   A

Complexity

Total Complexity 27

Size/Duplication

Total Lines 249
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 7

Importance

Changes 0
Metric Value
wmc 27
lcom 1
cbo 7
dl 0
loc 249
rs 10
c 0
b 0
f 0

9 Methods

Rating   Name   Duplication   Size   Complexity  
F load() 0 165 14
A prepend() 0 3 1
A configureClassesToCompile() 0 3 1
A getNamespace() 0 4 1
A buildStylesheets() 0 8 1
A buildJavascripts() 0 8 1
A mergeArray() 0 13 4
A replacePropertyAccessor() 0 12 2
A configureTwigTextExtension() 0 11 2
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the Sonata Project package.
7
 *
8
 * (c) Thomas Rabaix <[email protected]>
9
 *
10
 * For the full copyright and license information, please view the LICENSE
11
 * file that was distributed with this source code.
12
 */
13
14
namespace Sonata\AdminBundle\DependencyInjection;
15
16
use Sonata\AdminBundle\DependencyInjection\Compiler\ModelManagerCompilerPass;
17
use Sonata\AdminBundle\Model\ModelManagerInterface;
18
use Symfony\Component\Config\FileLocator;
19
use Symfony\Component\DependencyInjection\ContainerBuilder;
20
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
21
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
22
use Symfony\Component\DependencyInjection\Reference;
23
use Symfony\Component\Form\Extension\Core\Type\ChoiceType as SymfonyChoiceType;
24
use Symfony\Component\Form\Extension\Core\Type\DateTimeType as SymfonyDateTimeType;
25
use Symfony\Component\Form\Extension\Core\Type\DateType as SymfonyDateType;
26
use Symfony\Component\Form\Extension\Core\Type\EmailType as SymfonyEmailType;
27
use Symfony\Component\Form\Extension\Core\Type\IntegerType as SymfonyIntegerType;
28
use Symfony\Component\Form\Extension\Core\Type\TextareaType as SymfonyTextareaType;
29
use Symfony\Component\Form\Extension\Core\Type\TextType as SymfonyTextType;
30
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
31
32
/**
33
 * @final since sonata-project/admin-bundle 3.52
34
 *
35
 * @author Thomas Rabaix <[email protected]>
36
 * @author Michael Williams <[email protected]>
37
 */
38
class SonataAdminExtension extends Extension implements PrependExtensionInterface
39
{
40
    public function load(array $configs, ContainerBuilder $container)
41
    {
42
        $bundles = $container->getParameter('kernel.bundles');
43
44
        if (isset($bundles['SonataUserBundle'])) {
45
            // integrate the SonataUserBundle / FOSUserBundle if the bundle exists
46
            array_unshift($configs, [
47
                'templates' => [
48
                    'user_block' => '@SonataUser/Admin/Core/user_block.html.twig',
49
                ],
50
            ]);
51
        }
52
53
        if (isset($bundles['SonataIntlBundle'])) {
54
            // integrate the SonataUserBundle if the bundle exists
55
            array_unshift($configs, [
56
                'templates' => [
57
                    'history_revision_timestamp' => '@SonataIntl/CRUD/history_revision_timestamp.html.twig',
58
                ],
59
            ]);
60
        }
61
62
        $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
63
        $loader->load('actions.xml');
64
        $loader->load('block.xml');
65
        $loader->load('commands.xml');
66
        $loader->load('core.xml');
67
        $loader->load('event_listener.xml');
68
        $loader->load('form_types.xml');
69
        $loader->load('menu.xml');
70
        $loader->load('route.xml');
71
        $loader->load('twig.xml');
72
        $loader->load('validator.xml');
73
74
        if (isset($bundles['MakerBundle'])) {
75
            $loader->load('makers.xml');
76
        }
77
78
        if (isset($bundles['SonataExporterBundle'])) {
79
            $loader->load('exporter.xml');
80
        }
81
82
        $configuration = $this->getConfiguration($configs, $container);
83
        $config = $this->processConfiguration($configuration, $configs);
0 ignored issues
show
Documentation introduced by
$configuration is of type null|object, 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...
84
85
        $this->configureTwigTextExtension($container, $loader, $config);
86
87
        $config['options']['javascripts'] = $this->buildJavascripts($config);
88
        $config['options']['stylesheets'] = $this->buildStylesheets($config);
89
        $config['options']['role_admin'] = $config['security']['role_admin'];
90
        $config['options']['role_super_admin'] = $config['security']['role_super_admin'];
91
        $config['options']['search'] = $config['search'];
92
93
        $pool = $container->getDefinition('sonata.admin.pool');
94
        $pool->replaceArgument(1, $config['title']);
95
        $pool->replaceArgument(2, $config['title_logo']);
96
        $pool->replaceArgument(3, $config['options']);
97
98
        if (false === $config['options']['lock_protection']) {
99
            $container->removeDefinition('sonata.admin.lock.extension');
100
        }
101
102
        $container->setParameter('sonata.admin.configuration.global_search.empty_boxes', $config['global_search']['empty_boxes']);
103
        $container->setParameter('sonata.admin.configuration.global_search.case_sensitive', $config['global_search']['case_sensitive']);
104
        $container->setParameter('sonata.admin.configuration.templates', $config['templates']);
105
        $container->setParameter('sonata.admin.configuration.admin_services', $config['admin_services']);
106
        $container->setParameter('sonata.admin.configuration.dashboard_groups', $config['dashboard']['groups']);
107
        $container->setParameter('sonata.admin.configuration.dashboard_blocks', $config['dashboard']['blocks']);
108
        $container->setParameter('sonata.admin.configuration.sort_admins', $config['options']['sort_admins']);
109
        $container->setParameter(
110
            'sonata.admin.configuration.mosaic_background',
111
            $config['options']['mosaic_background']
112
        );
113
        $container->setParameter('sonata.admin.configuration.default_group', $config['options']['default_group']);
114
        $container->setParameter('sonata.admin.configuration.default_label_catalogue', $config['options']['default_label_catalogue']);
115
        $container->setParameter('sonata.admin.configuration.default_icon', $config['options']['default_icon']);
116
        $container->setParameter('sonata.admin.configuration.breadcrumbs', $config['breadcrumbs']);
117
118
        if (null === $config['security']['acl_user_manager'] && isset($bundles['FOSUserBundle'])) {
119
            $container->setParameter('sonata.admin.security.acl_user_manager', 'fos_user.user_manager');
120
        } else {
121
            $container->setParameter('sonata.admin.security.acl_user_manager', $config['security']['acl_user_manager']);
122
        }
123
124
        $container->setAlias('sonata.admin.security.handler', $config['security']['handler']);
125
126
        switch ($config['security']['handler']) {
127
            case 'sonata.admin.security.handler.role':
128
                if (0 === \count($config['security']['information'])) {
129
                    $config['security']['information'] = [
130
                        'EDIT' => ['EDIT'],
131
                        'LIST' => ['LIST'],
132
                        'CREATE' => ['CREATE'],
133
                        'VIEW' => ['VIEW'],
134
                        'DELETE' => ['DELETE'],
135
                        'EXPORT' => ['EXPORT'],
136
                        'ALL' => ['ALL'],
137
                    ];
138
                }
139
140
                break;
141
            case 'sonata.admin.security.handler.acl':
142
                if (0 === \count($config['security']['information'])) {
143
                    $config['security']['information'] = [
144
                        'GUEST' => ['VIEW', 'LIST'],
145
                        'STAFF' => ['EDIT', 'LIST', 'CREATE'],
146
                        'EDITOR' => ['OPERATOR', 'EXPORT'],
147
                        'ADMIN' => ['MASTER'],
148
                    ];
149
                }
150
151
                break;
152
        }
153
154
        $container->setParameter('sonata.admin.configuration.security.role_admin', $config['security']['role_admin']);
155
        $container->setParameter('sonata.admin.configuration.security.role_super_admin', $config['security']['role_super_admin']);
156
        $container->setParameter('sonata.admin.configuration.security.information', $config['security']['information']);
157
        $container->setParameter('sonata.admin.configuration.security.admin_permissions', $config['security']['admin_permissions']);
158
        $container->setParameter('sonata.admin.configuration.security.object_permissions', $config['security']['object_permissions']);
159
160
        $loader->load('security.xml');
161
162
        $container->setParameter('sonata.admin.extension.map', $config['extensions']);
163
164
        /*
165
         * This is a work in progress, so for now it is hardcoded
166
         */
167
        $classes = [
168
            SymfonyChoiceType::class => '',
169
            SymfonyDateType::class => 'sonata-medium-date',
170
            SymfonyDateTimeType::class => 'sonata-medium-date',
171
            SymfonyEmailType::class => '',
172
            SymfonyIntegerType::class => '',
173
            SymfonyTextareaType::class => '',
174
            SymfonyTextType::class => '',
175
        ];
176
177
        $container->getDefinition('sonata.admin.form.extension.field')
178
            ->replaceArgument(0, $classes)
179
            ->replaceArgument(1, $config['options']);
180
181
        // remove non used service
182
        if (!isset($bundles['JMSTranslationBundle'])) {
183
            $container->removeDefinition('sonata.admin.translator.extractor.jms_translator_bundle');
184
        }
185
186
        // remove non-Mopa compatibility layer
187
        if (isset($bundles['MopaBootstrapBundle'])) {
188
            $container->removeDefinition('sonata.admin.form.extension.field.mopa');
189
        }
190
191
        // set filter persistence
192
        $container->setParameter('sonata.admin.configuration.filters.persist', $config['persist_filters']);
193
        $container->setParameter('sonata.admin.configuration.filters.persister', $config['filter_persister']);
194
195
        $container->setParameter('sonata.admin.configuration.show.mosaic.button', $config['show_mosaic_button']);
196
197
        $container->setParameter('sonata.admin.configuration.translate_group_label', $config['translate_group_label']);
198
199
        $this->replacePropertyAccessor($container);
200
201
        $container
202
            ->registerForAutoconfiguration(ModelManagerInterface::class)
203
            ->addTag(ModelManagerCompilerPass::MANAGER_TAG);
204
    }
205
206
    /**
207
     * Allow an extension to prepend the extension configurations.
208
     */
209
    public function prepend(ContainerBuilder $container)
210
    {
211
    }
212
213
    /**
214
     * NEXT_MAJOR: remove this property.
215
     *
216
     * @deprecated since sonata-project/admin-bundle 3.56
217
     */
218
    public function configureClassesToCompile()
219
    {
220
    }
221
222
    public function getNamespace()
223
    {
224
        return 'https://sonata-project.org/schema/dic/admin';
225
    }
226
227
    private function buildStylesheets(array $config): array
228
    {
229
        return $this->mergeArray(
230
            $config['assets']['stylesheets'],
231
            $config['assets']['extra_stylesheets'],
232
            $config['assets']['remove_stylesheets']
233
        );
234
    }
235
236
    private function buildJavascripts(array $config): array
237
    {
238
        return $this->mergeArray(
239
            $config['assets']['javascripts'],
240
            $config['assets']['extra_javascripts'],
241
            $config['assets']['remove_javascripts']
242
        );
243
    }
244
245
    private function mergeArray(array $array, array $addArray, array $removeArray = []): array
246
    {
247
        foreach ($addArray as $toAdd) {
248
            array_push($array, $toAdd);
249
        }
250
        foreach ($removeArray as $toRemove) {
251
            if (\in_array($toRemove, $array, true)) {
252
                array_splice($array, array_search($toRemove, $array, true), 1);
253
            }
254
        }
255
256
        return $array;
257
    }
258
259
    private function replacePropertyAccessor(ContainerBuilder $container): void
260
    {
261
        if (!$container->has('form.property_accessor')) {
262
            return;
263
        }
264
265
        $pool = $container->getDefinition('sonata.admin.pool');
266
        $pool->replaceArgument(4, new Reference('form.property_accessor'));
267
268
        $modelChoice = $container->getDefinition('sonata.admin.form.type.model_choice');
269
        $modelChoice->replaceArgument(0, new Reference('form.property_accessor'));
270
    }
271
272
    /**
273
     * NEXT_MAJOR: remove this method.
274
     */
275
    private function configureTwigTextExtension(ContainerBuilder $container, XmlFileLoader $loader, array $config): void
276
    {
277
        $container->setParameter('sonata.admin.configuration.legacy_twig_text_extension', $config['options']['legacy_twig_text_extension']);
278
        $loader->load('twig_string.xml');
279
280
        if (false !== $config['options']['legacy_twig_text_extension']) {
281
            $container
282
                ->getDefinition('sonata.string.twig.extension')
283
                ->replaceArgument(0, new Reference('sonata.deprecated_text.twig.extension'));
284
        }
285
    }
286
}
287