SonataAdminExtension::load()   F
last analyzed

Complexity

Conditions 13
Paths 640

Size

Total Lines 156

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 156
rs 2.36
c 0
b 0
f 0
cc 13
nc 640
nop 2

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
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\Loader\XmlFileLoader;
21
use Symfony\Component\DependencyInjection\Reference;
22
use Symfony\Component\Form\Extension\Core\Type\ChoiceType as SymfonyChoiceType;
23
use Symfony\Component\Form\Extension\Core\Type\DateTimeType as SymfonyDateTimeType;
24
use Symfony\Component\Form\Extension\Core\Type\DateType as SymfonyDateType;
25
use Symfony\Component\Form\Extension\Core\Type\EmailType as SymfonyEmailType;
26
use Symfony\Component\Form\Extension\Core\Type\IntegerType as SymfonyIntegerType;
27
use Symfony\Component\Form\Extension\Core\Type\TextareaType as SymfonyTextareaType;
28
use Symfony\Component\Form\Extension\Core\Type\TextType as SymfonyTextType;
29
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
30
31
/**
32
 * @author Thomas Rabaix <[email protected]>
33
 * @author Michael Williams <[email protected]>
34
 */
35
final class SonataAdminExtension extends Extension
36
{
37
    public function load(array $configs, ContainerBuilder $container): void
38
    {
39
        $bundles = $container->getParameter('kernel.bundles');
40
41
        if (isset($bundles['SonataUserBundle'])) {
42
            // integrate the SonataUserBundle / FOSUserBundle if the bundle exists
43
            array_unshift($configs, [
44
                'templates' => [
45
                    'user_block' => '@SonataUser/Admin/Core/user_block.html.twig',
46
                ],
47
            ]);
48
        }
49
50
        if (isset($bundles['SonataIntlBundle'])) {
51
            // integrate the SonataUserBundle if the bundle exists
52
            array_unshift($configs, [
53
                'templates' => [
54
                    'history_revision_timestamp' => '@SonataIntl/CRUD/history_revision_timestamp.html.twig',
55
                ],
56
            ]);
57
        }
58
59
        $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
60
        $loader->load('actions.xml');
61
        $loader->load('block.xml');
62
        $loader->load('commands.xml');
63
        $loader->load('core.xml');
64
        $loader->load('event_listener.xml');
65
        $loader->load('form_types.xml');
66
        $loader->load('menu.xml');
67
        $loader->load('route.xml');
68
        $loader->load('twig.xml');
69
        $loader->load('validator.xml');
70
71
        if (isset($bundles['MakerBundle'])) {
72
            $loader->load('makers.xml');
73
        }
74
75
        if (isset($bundles['SonataExporterBundle'])) {
76
            $loader->load('exporter.xml');
77
        }
78
79
        $configuration = $this->getConfiguration($configs, $container);
80
        $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...
81
82
        $config['options']['javascripts'] = $this->buildJavascripts($config);
83
        $config['options']['stylesheets'] = $this->buildStylesheets($config);
84
        $config['options']['role_admin'] = $config['security']['role_admin'];
85
        $config['options']['role_super_admin'] = $config['security']['role_super_admin'];
86
        $config['options']['search'] = $config['search'];
87
88
        $pool = $container->getDefinition('sonata.admin.pool');
89
        $pool->replaceArgument(1, $config['title']);
90
        $pool->replaceArgument(2, $config['title_logo']);
91
        $pool->replaceArgument(3, $config['options']);
92
93
        if (false === $config['options']['lock_protection']) {
94
            $container->removeDefinition('sonata.admin.lock.extension');
95
        }
96
97
        $container->setParameter('sonata.admin.configuration.global_search.empty_boxes', $config['global_search']['empty_boxes']);
98
        $container->setParameter('sonata.admin.configuration.global_search.case_sensitive', $config['global_search']['case_sensitive']);
99
        $container->setParameter('sonata.admin.configuration.templates', $config['templates']);
100
        $container->setParameter('sonata.admin.configuration.admin_services', $config['admin_services']);
101
        $container->setParameter('sonata.admin.configuration.dashboard_groups', $config['dashboard']['groups']);
102
        $container->setParameter('sonata.admin.configuration.dashboard_blocks', $config['dashboard']['blocks']);
103
        $container->setParameter('sonata.admin.configuration.sort_admins', $config['options']['sort_admins']);
104
        $container->setParameter(
105
            'sonata.admin.configuration.mosaic_background',
106
            $config['options']['mosaic_background']
107
        );
108
        $container->setParameter('sonata.admin.configuration.default_group', $config['options']['default_group']);
109
        $container->setParameter('sonata.admin.configuration.default_label_catalogue', $config['options']['default_label_catalogue']);
110
        $container->setParameter('sonata.admin.configuration.default_icon', $config['options']['default_icon']);
111
        $container->setParameter('sonata.admin.configuration.breadcrumbs', $config['breadcrumbs']);
112
113
        if (null === $config['security']['acl_user_manager'] && isset($bundles['FOSUserBundle'])) {
114
            $container->setParameter('sonata.admin.security.acl_user_manager', 'fos_user.user_manager');
115
        } else {
116
            $container->setParameter('sonata.admin.security.acl_user_manager', $config['security']['acl_user_manager']);
117
        }
118
119
        $container->setAlias('sonata.admin.security.handler', $config['security']['handler']);
120
121
        switch ($config['security']['handler']) {
122
            case 'sonata.admin.security.handler.role':
123
                if (0 === \count($config['security']['information'])) {
124
                    $config['security']['information'] = [
125
                        'EDIT' => ['EDIT'],
126
                        'LIST' => ['LIST'],
127
                        'CREATE' => ['CREATE'],
128
                        'VIEW' => ['VIEW'],
129
                        'DELETE' => ['DELETE'],
130
                        'EXPORT' => ['EXPORT'],
131
                        'ALL' => ['ALL'],
132
                    ];
133
                }
134
135
                break;
136
            case 'sonata.admin.security.handler.acl':
137
                if (0 === \count($config['security']['information'])) {
138
                    $config['security']['information'] = [
139
                        'GUEST' => ['VIEW', 'LIST'],
140
                        'STAFF' => ['EDIT', 'LIST', 'CREATE'],
141
                        'EDITOR' => ['OPERATOR', 'EXPORT'],
142
                        'ADMIN' => ['MASTER'],
143
                    ];
144
                }
145
146
                break;
147
        }
148
149
        $container->setParameter('sonata.admin.configuration.security.role_admin', $config['security']['role_admin']);
150
        $container->setParameter('sonata.admin.configuration.security.role_super_admin', $config['security']['role_super_admin']);
151
        $container->setParameter('sonata.admin.configuration.security.information', $config['security']['information']);
152
        $container->setParameter('sonata.admin.configuration.security.admin_permissions', $config['security']['admin_permissions']);
153
        $container->setParameter('sonata.admin.configuration.security.object_permissions', $config['security']['object_permissions']);
154
155
        $loader->load('security.xml');
156
157
        $container->setParameter('sonata.admin.extension.map', $config['extensions']);
158
159
        /*
160
         * This is a work in progress, so for now it is hardcoded
161
         */
162
        $classes = [
163
            SymfonyChoiceType::class => '',
164
            SymfonyDateType::class => 'sonata-medium-date',
165
            SymfonyDateTimeType::class => 'sonata-medium-date',
166
            SymfonyEmailType::class => '',
167
            SymfonyIntegerType::class => '',
168
            SymfonyTextareaType::class => '',
169
            SymfonyTextType::class => '',
170
        ];
171
172
        $container->getDefinition('sonata.admin.form.extension.field')
173
            ->replaceArgument(0, $classes)
174
            ->replaceArgument(1, $config['options']);
175
176
        // remove non-Mopa compatibility layer
177
        if (isset($bundles['MopaBootstrapBundle'])) {
178
            $container->removeDefinition('sonata.admin.form.extension.field.mopa');
179
        }
180
181
        // set filter persistence
182
        $container->setParameter('sonata.admin.configuration.filters.persist', $config['persist_filters']);
183
        $container->setParameter('sonata.admin.configuration.filters.persister', $config['filter_persister']);
184
185
        $container->setParameter('sonata.admin.configuration.show.mosaic.button', $config['show_mosaic_button']);
186
187
        $this->replacePropertyAccessor($container);
188
189
        $container
190
            ->registerForAutoconfiguration(ModelManagerInterface::class)
191
            ->addTag(ModelManagerCompilerPass::MANAGER_TAG);
192
    }
193
194
    public function getNamespace()
195
    {
196
        return 'https://sonata-project.org/schema/dic/admin';
197
    }
198
199
    private function buildStylesheets(array $config): array
200
    {
201
        return $this->mergeArray(
202
            $config['assets']['stylesheets'],
203
            $config['assets']['extra_stylesheets'],
204
            $config['assets']['remove_stylesheets']
205
        );
206
    }
207
208
    private function buildJavascripts(array $config): array
209
    {
210
        return $this->mergeArray(
211
            $config['assets']['javascripts'],
212
            $config['assets']['extra_javascripts'],
213
            $config['assets']['remove_javascripts']
214
        );
215
    }
216
217
    private function mergeArray(array $array, array $addArray, array $removeArray = []): array
218
    {
219
        foreach ($addArray as $toAdd) {
220
            array_push($array, $toAdd);
221
        }
222
        foreach ($removeArray as $toRemove) {
223
            if (\in_array($toRemove, $array, true)) {
224
                array_splice($array, array_search($toRemove, $array, true), 1);
225
            }
226
        }
227
228
        return $array;
229
    }
230
231
    private function replacePropertyAccessor(ContainerBuilder $container): void
232
    {
233
        if (!$container->has('form.property_accessor')) {
234
            return;
235
        }
236
237
        $pool = $container->getDefinition('sonata.admin.pool');
238
        $pool->replaceArgument(4, new Reference('form.property_accessor'));
239
240
        $modelChoice = $container->getDefinition('sonata.admin.form.type.model_choice');
241
        $modelChoice->replaceArgument(0, new Reference('form.property_accessor'));
242
    }
243
}
244