Completed
Push — 3.x ( 06cb47...ee8105 )
by Grégoire
06:40 queued 02:46
created

SonataAdminExtension::buildJavascripts()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 8
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 5
nc 1
nop 1
1
<?php
2
3
/*
4
 * This file is part of the Sonata Project package.
5
 *
6
 * (c) Thomas Rabaix <[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 Sonata\AdminBundle\DependencyInjection;
13
14
use JMS\DiExtraBundle\DependencyInjection\Configuration;
0 ignored issues
show
Bug introduced by
This use statement conflicts with another class in this namespace, Sonata\AdminBundle\Depen...Injection\Configuration.

Let’s assume that you have a directory layout like this:

.
|-- OtherDir
|   |-- Bar.php
|   `-- Foo.php
`-- SomeDir
    `-- Foo.php

and let’s assume the following content of Bar.php:

// Bar.php
namespace OtherDir;

use SomeDir\Foo; // This now conflicts the class OtherDir\Foo

If both files OtherDir/Foo.php and SomeDir/Foo.php are loaded in the same runtime, you will see a PHP error such as the following:

PHP Fatal error:  Cannot use SomeDir\Foo as Foo because the name is already in use in OtherDir/Foo.php

However, as OtherDir/Foo.php does not necessarily have to be loaded and the error is only triggered if it is loaded before OtherDir/Bar.php, this problem might go unnoticed for a while. In order to prevent this error from surfacing, you must import the namespace with a different alias:

// Bar.php
namespace OtherDir;

use SomeDir\Foo as SomeDirFoo; // There is no conflict anymore.
Loading history...
15
use Sonata\AdminBundle\Admin\AbstractAdmin;
16
use Sonata\AdminBundle\Admin\AbstractAdminExtension;
17
use Sonata\AdminBundle\Admin\AdminExtensionInterface;
18
use Sonata\AdminBundle\Admin\AdminHelper;
19
use Sonata\AdminBundle\Admin\AdminInterface;
20
use Sonata\AdminBundle\Admin\BaseFieldDescription;
21
use Sonata\AdminBundle\Admin\FieldDescriptionCollection;
22
use Sonata\AdminBundle\Admin\FieldDescriptionInterface;
23
use Sonata\AdminBundle\Admin\Pool;
24
use Sonata\AdminBundle\Block\AdminListBlockService;
25
use Sonata\AdminBundle\Builder\DatagridBuilderInterface;
26
use Sonata\AdminBundle\Builder\FormContractorInterface;
27
use Sonata\AdminBundle\Builder\ListBuilderInterface;
28
use Sonata\AdminBundle\Builder\RouteBuilderInterface;
29
use Sonata\AdminBundle\Builder\ShowBuilderInterface;
30
use Sonata\AdminBundle\Datagrid\Datagrid;
31
use Sonata\AdminBundle\Datagrid\DatagridInterface;
32
use Sonata\AdminBundle\Datagrid\DatagridMapper;
33
use Sonata\AdminBundle\Datagrid\ListMapper;
34
use Sonata\AdminBundle\Datagrid\Pager;
35
use Sonata\AdminBundle\Datagrid\PagerInterface;
36
use Sonata\AdminBundle\Datagrid\ProxyQueryInterface;
37
use Sonata\AdminBundle\Exception\ModelManagerException;
38
use Sonata\AdminBundle\Exception\NoValueException;
39
use Sonata\AdminBundle\Filter\Filter;
40
use Sonata\AdminBundle\Filter\FilterFactory;
41
use Sonata\AdminBundle\Filter\FilterFactoryInterface;
42
use Sonata\AdminBundle\Filter\FilterInterface;
43
use Sonata\AdminBundle\Form\DataTransformer\ArrayToModelTransformer;
44
use Sonata\AdminBundle\Form\DataTransformer\ModelsToArrayTransformer;
45
use Sonata\AdminBundle\Form\DataTransformer\ModelToIdTransformer;
46
use Sonata\AdminBundle\Form\EventListener\MergeCollectionListener;
47
use Sonata\AdminBundle\Form\Extension\Field\Type\FormTypeFieldExtension;
48
use Sonata\AdminBundle\Form\FormMapper;
49
use Sonata\AdminBundle\Form\Type\AdminType;
50
use Sonata\AdminBundle\Form\Type\Filter\ChoiceType;
51
use Sonata\AdminBundle\Form\Type\Filter\DateRangeType;
52
use Sonata\AdminBundle\Form\Type\Filter\DateTimeRangeType;
53
use Sonata\AdminBundle\Form\Type\Filter\DateTimeType;
54
use Sonata\AdminBundle\Form\Type\Filter\DateType;
55
use Sonata\AdminBundle\Form\Type\Filter\DefaultType;
56
use Sonata\AdminBundle\Form\Type\Filter\NumberType;
57
use Sonata\AdminBundle\Form\Type\ModelListType;
58
use Sonata\AdminBundle\Form\Type\ModelReferenceType;
59
use Sonata\AdminBundle\Form\Type\ModelType;
60
use Sonata\AdminBundle\Guesser\TypeGuesserChain;
61
use Sonata\AdminBundle\Guesser\TypeGuesserInterface;
62
use Sonata\AdminBundle\Model\AuditManager;
63
use Sonata\AdminBundle\Model\AuditManagerInterface;
64
use Sonata\AdminBundle\Model\AuditReaderInterface;
65
use Sonata\AdminBundle\Model\ModelManagerInterface;
66
use Sonata\AdminBundle\Route\AdminPoolLoader;
67
use Sonata\AdminBundle\Route\DefaultRouteGenerator;
68
use Sonata\AdminBundle\Route\PathInfoBuilder;
69
use Sonata\AdminBundle\Route\QueryStringBuilder;
70
use Sonata\AdminBundle\Route\RouteCollection;
71
use Sonata\AdminBundle\Route\RouteGeneratorInterface;
72
use Sonata\AdminBundle\Security\Acl\Permission\AdminPermissionMap;
73
use Sonata\AdminBundle\Security\Acl\Permission\MaskBuilder;
74
use Sonata\AdminBundle\Security\Handler\AclSecurityHandler;
75
use Sonata\AdminBundle\Security\Handler\AclSecurityHandlerInterface;
76
use Sonata\AdminBundle\Security\Handler\NoopSecurityHandler;
77
use Sonata\AdminBundle\Security\Handler\RoleSecurityHandler;
78
use Sonata\AdminBundle\Security\Handler\SecurityHandlerInterface;
79
use Sonata\AdminBundle\Show\ShowMapper;
80
use Sonata\AdminBundle\Translator\BCLabelTranslatorStrategy;
81
use Sonata\AdminBundle\Translator\FormLabelTranslatorStrategy;
82
use Sonata\AdminBundle\Translator\LabelTranslatorStrategyInterface;
83
use Sonata\AdminBundle\Translator\NativeLabelTranslatorStrategy;
84
use Sonata\AdminBundle\Translator\NoopLabelTranslatorStrategy;
85
use Sonata\AdminBundle\Translator\UnderscoreLabelTranslatorStrategy;
86
use Sonata\AdminBundle\Twig\Extension\SonataAdminExtension as TwigSonataAdminExtension;
87
use Sonata\AdminBundle\Util\AdminAclManipulator;
88
use Sonata\AdminBundle\Util\AdminAclManipulatorInterface;
89
use Sonata\AdminBundle\Util\FormBuilderIterator;
90
use Sonata\AdminBundle\Util\FormViewIterator;
91
use Sonata\AdminBundle\Util\ObjectAclManipulator;
92
use Sonata\AdminBundle\Util\ObjectAclManipulatorInterface;
93
use Symfony\Component\Config\FileLocator;
94
use Symfony\Component\DependencyInjection\ContainerBuilder;
95
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
96
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
97
use Symfony\Component\DependencyInjection\Reference;
98
use Symfony\Component\Form\Extension\Core\Type\ChoiceType as SymfonyChoiceType;
99
use Symfony\Component\Form\Extension\Core\Type\DateTimeType as SymfonyDateTimeType;
100
use Symfony\Component\Form\Extension\Core\Type\DateType as SymfonyDateType;
101
use Symfony\Component\Form\Extension\Core\Type\EmailType as SymfonyEmailType;
102
use Symfony\Component\Form\Extension\Core\Type\IntegerType as SymfonyIntegerType;
103
use Symfony\Component\Form\Extension\Core\Type\TextareaType as SymfonyTextareaType;
104
use Symfony\Component\Form\Extension\Core\Type\TextType as SymfonyTextType;
105
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
106
107
/**
108
 * @author Thomas Rabaix <[email protected]>
109
 * @author Michael Williams <[email protected]>
110
 */
111
class SonataAdminExtension extends Extension implements PrependExtensionInterface
112
{
113
    public function load(array $configs, ContainerBuilder $container)
114
    {
115
        $bundles = $container->getParameter('kernel.bundles');
116
117
        if (isset($bundles['SonataUserBundle'])) {
118
            // integrate the SonataUserBundle / FOSUserBundle if the bundle exists
119
            array_unshift($configs, [
120
                'templates' => [
121
                    'user_block' => 'SonataUserBundle:Admin/Core:user_block.html.twig',
122
                ],
123
            ]);
124
        }
125
126
        if (isset($bundles['SonataIntlBundle'])) {
127
            // integrate the SonataUserBundle if the bundle exists
128
            array_unshift($configs, [
129
                'templates' => [
130
                    'history_revision_timestamp' => 'SonataIntlBundle:CRUD:history_revision_timestamp.html.twig',
131
                ],
132
            ]);
133
        }
134
135
        $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
136
        $loader->load('twig.xml');
137
        $loader->load('core.xml');
138
        $loader->load('form_types.xml');
139
        $loader->load('validator.xml');
140
        $loader->load('route.xml');
141
        $loader->load('block.xml');
142
        $loader->load('menu.xml');
143
        $loader->load('commands.xml');
144
145
        if (isset($bundles['SonataExporterBundle'])) {
146
            $loader->load('exporter.xml');
147
        }
148
149
        $container->getDefinition('sonata.admin.exporter')->setDeprecated(
150
            'The service "%service_id%" is deprecated in favor of the "sonata.exporter.exporter" service'
0 ignored issues
show
Documentation introduced by
'The service "%service_i...rter.exporter" service' is of type string, but the function expects a boolean.

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...
151
        );
152
153
        $configuration = $this->getConfiguration($configs, $container);
154
        $config = $this->processConfiguration($configuration, $configs);
0 ignored issues
show
Documentation introduced by
$configuration 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...
155
156
        $config['options']['javascripts'] = $this->buildJavascripts($config);
157
        $config['options']['stylesheets'] = $this->buildStylesheets($config);
158
        $config['options']['role_admin'] = $config['security']['role_admin'];
159
        $config['options']['role_super_admin'] = $config['security']['role_super_admin'];
160
161
        $pool = $container->getDefinition('sonata.admin.pool');
162
        $pool->replaceArgument(1, $config['title']);
163
        $pool->replaceArgument(2, $config['title_logo']);
164
        $pool->replaceArgument(3, $config['options']);
165
166
        if (false === $config['options']['lock_protection']) {
167
            $container->removeDefinition('sonata.admin.lock.extension');
168
        }
169
170
        $container->setParameter('sonata.admin.configuration.global_search.empty_boxes', $config['global_search']['empty_boxes']);
171
        $container->setParameter('sonata.admin.configuration.templates', $config['templates'] + [
172
            'user_block' => 'SonataAdminBundle:Core:user_block.html.twig',
173
            'add_block' => 'SonataAdminBundle:Core:add_block.html.twig',
174
            'layout' => 'SonataAdminBundle::standard_layout.html.twig',
175
            'ajax' => 'SonataAdminBundle::ajax_layout.html.twig',
176
            'dashboard' => 'SonataAdminBundle:Core:dashboard.html.twig',
177
            'list' => 'SonataAdminBundle:CRUD:list.html.twig',
178
            'filter' => 'SonataAdminBundle:Form:filter_admin_fields.html.twig',
179
            'show' => 'SonataAdminBundle:CRUD:show.html.twig',
180
            'show_compare' => 'SonataAdminBundle:CRUD:show_compare.html.twig',
181
            'edit' => 'SonataAdminBundle:CRUD:edit.html.twig',
182
            'history' => 'SonataAdminBundle:CRUD:history.html.twig',
183
            'history_revision_timestamp' => 'SonataAdminBundle:CRUD:history_revision_timestamp.html.twig',
184
            'acl' => 'SonataAdminBundle:CRUD:acl.html.twig',
185
            'action' => 'SonataAdminBundle:CRUD:action.html.twig',
186
            'short_object_description' => 'SonataAdminBundle:Helper:short-object-description.html.twig',
187
            'preview' => 'SonataAdminBundle:CRUD:preview.html.twig',
188
            'list_block' => 'SonataAdminBundle:Block:block_admin_list.html.twig',
189
            'delete' => 'SonataAdminBundle:CRUD:delete.html.twig',
190
            'batch' => 'SonataAdminBundle:CRUD:list__batch.html.twig',
191
            'select' => 'SonataAdminBundle:CRUD:list__select.html.twig',
192
            'batch_confirmation' => 'SonataAdminBundle:CRUD:batch_confirmation.html.twig',
193
            'inner_list_row' => 'SonataAdminBundle:CRUD:list_inner_row.html.twig',
194
            'base_list_field' => 'SonataAdminBundle:CRUD:base_list_field.html.twig',
195
            'pager_links' => 'SonataAdminBundle:Pager:links.html.twig',
196
            'pager_results' => 'SonataAdminBundle:Pager:results.html.twig',
197
            'tab_menu_template' => 'SonataAdminBundle:Core:tab_menu_template.html.twig',
198
            'knp_menu_template' => 'SonataAdminBundle:Menu:sonata_menu.html.twig',
199
            'outer_list_rows_mosaic' => 'SonataAdminBundle:CRUD:list_outer_rows_mosaic.html.twig',
200
            'outer_list_rows_list' => 'SonataAdminBundle:CRUD:list_outer_rows_list.html.twig',
201
            'outer_list_rows_tree' => 'SonataAdminBundle:CRUD:list_outer_rows_tree.html.twig',
202
        ]);
203
        $container->setParameter('sonata.admin.configuration.admin_services', $config['admin_services']);
204
        $container->setParameter('sonata.admin.configuration.dashboard_groups', $config['dashboard']['groups']);
205
        $container->setParameter('sonata.admin.configuration.dashboard_blocks', $config['dashboard']['blocks']);
206
        $container->setParameter('sonata.admin.configuration.sort_admins', $config['options']['sort_admins']);
207
        $container->setParameter('sonata.admin.configuration.breadcrumbs', $config['breadcrumbs']);
208
209
        if (null === $config['security']['acl_user_manager'] && isset($bundles['FOSUserBundle'])) {
210
            $container->setParameter('sonata.admin.security.acl_user_manager', 'fos_user.user_manager');
211
        } else {
212
            $container->setParameter('sonata.admin.security.acl_user_manager', $config['security']['acl_user_manager']);
213
        }
214
215
        $container->setAlias('sonata.admin.security.handler', $config['security']['handler']);
216
217
        switch ($config['security']['handler']) {
218
            case 'sonata.admin.security.handler.role':
219
                if (0 === count($config['security']['information'])) {
220
                    $config['security']['information'] = [
221
                        'EDIT' => ['EDIT'],
222
                        'LIST' => ['LIST'],
223
                        'CREATE' => ['CREATE'],
224
                        'VIEW' => ['VIEW'],
225
                        'DELETE' => ['DELETE'],
226
                        'EXPORT' => ['EXPORT'],
227
                        'ALL' => ['ALL'],
228
                    ];
229
                }
230
231
                break;
232
            case 'sonata.admin.security.handler.acl':
233
                if (0 === count($config['security']['information'])) {
234
                    $config['security']['information'] = [
235
                        'GUEST' => ['VIEW', 'LIST'],
236
                        'STAFF' => ['EDIT', 'LIST', 'CREATE'],
237
                        'EDITOR' => ['OPERATOR', 'EXPORT'],
238
                        'ADMIN' => ['MASTER'],
239
                    ];
240
                }
241
242
                break;
243
        }
244
245
        $container->setParameter('sonata.admin.configuration.security.role_admin', $config['security']['role_admin']);
246
        $container->setParameter('sonata.admin.configuration.security.role_super_admin', $config['security']['role_super_admin']);
247
        $container->setParameter('sonata.admin.configuration.security.information', $config['security']['information']);
248
        $container->setParameter('sonata.admin.configuration.security.admin_permissions', $config['security']['admin_permissions']);
249
        $container->setParameter('sonata.admin.configuration.security.object_permissions', $config['security']['object_permissions']);
250
251
        $loader->load('security.xml');
252
253
        $container->setParameter('sonata.admin.extension.map', $config['extensions']);
254
255
        /*
256
         * This is a work in progress, so for now it is hardcoded
257
         */
258
        $classes = [
259
            'email' => '',
260
            'textarea' => '',
261
            'text' => '',
262
            'choice' => '',
263
            'integer' => '',
264
            'datetime' => 'sonata-medium-date',
265
            'date' => 'sonata-medium-date',
266
267
            // SF3+
268
            SymfonyChoiceType::class => '',
269
            SymfonyDateType::class => 'sonata-medium-date',
270
            SymfonyDateTimeType::class => 'sonata-medium-date',
271
            SymfonyEmailType::class => '',
272
            SymfonyIntegerType::class => '',
273
            SymfonyTextareaType::class => '',
274
            SymfonyTextType::class => '',
275
        ];
276
277
        $container->getDefinition('sonata.admin.form.extension.field')
278
            ->replaceArgument(0, $classes)
279
            ->replaceArgument(1, $config['options']);
280
281
        // remove non used service
282
        if (!isset($bundles['JMSTranslationBundle'])) {
283
            $container->removeDefinition('sonata.admin.translator.extractor.jms_translator_bundle');
284
        }
285
286
        //remove non-Mopa compatibility layer
287
        if (isset($bundles['MopaBootstrapBundle'])) {
288
            $container->removeDefinition('sonata.admin.form.extension.field.mopa');
289
        }
290
291
        // set filter persistence
292
        $container->setParameter('sonata.admin.configuration.filters.persist', $config['persist_filters']);
293
294
        $container->setParameter('sonata.admin.configuration.show.mosaic.button', $config['show_mosaic_button']);
295
296
        $container->setParameter('sonata.admin.configuration.translate_group_label', $config['translate_group_label']);
297
298
        if (\PHP_VERSION_ID < 70000) {
299
            $this->configureClassesToCompile();
300
        }
301
302
        $this->replacePropertyAccessor($container);
303
    }
304
305
    /**
306
     * Allow an extension to prepend the extension configurations.
307
     *
308
     * NEXT_MAJOR: remove all code that deals with JMSDiExtraBundle
309
     */
310
    public function prepend(ContainerBuilder $container)
311
    {
312
        $bundles = $container->getParameter('kernel.bundles');
313
314
        if (!isset($bundles['JMSDiExtraBundle'])) {
315
            return;
316
        }
317
318
        $configs = $container->getExtensionConfig($this->getAlias());
319
        $config = $this->processConfiguration(new Configuration(), $configs);
320
        if (!$config['options']['enable_jms_di_extra_autoregistration']) {
321
            return;
322
        }
323
324
        $sonataAdminPattern = 'Sonata\AdminBundle\Annotation';
325
        $annotationPatternsConfigured = false;
326
327
        $diExtraConfigs = $container->getExtensionConfig('jms_di_extra');
328
        foreach ($diExtraConfigs as $diExtraConfig) {
329
            if (isset($diExtraConfig['annotation_patterns'])) {
330
                // don't add our own pattern if user has already done so
331
                if (false !== array_search($sonataAdminPattern, $diExtraConfig['annotation_patterns'])) {
332
                    return;
333
                }
334
                $annotationPatternsConfigured = true;
335
336
                break;
337
            }
338
        }
339
340
        @trigger_error(
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition here. This can introduce security issues, and is generally not recommended.

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
341
            'Automatic registration of annotations is deprecated since 3.14, to be removed in 4.0.',
342
            E_USER_DEPRECATED
343
        );
344
345
        if ($annotationPatternsConfigured) {
346
            $annotationPatterns = [$sonataAdminPattern];
347
        } else {
348
            // get annotation_patterns default from DiExtraBundle configuration
349
            $diExtraConfigDefinition = new Configuration();
350
            // FIXME: this will break if DiExtraBundle adds any mandatory configuration
351
            $diExtraConfig = $this->processConfiguration($diExtraConfigDefinition, []);
352
353
            $annotationPatterns = $diExtraConfig['annotation_patterns'];
354
            $annotationPatterns[] = $sonataAdminPattern;
355
        }
356
357
        $container->prependExtensionConfig(
358
            'jms_di_extra',
359
            [
360
                'annotation_patterns' => $annotationPatterns,
361
            ]
362
        );
363
    }
364
365
    public function configureClassesToCompile()
366
    {
367
        $this->addClassesToCompile([
0 ignored issues
show
Bug introduced by
The method addClassesToCompile() does not seem to exist on object<Sonata\AdminBundl...n\SonataAdminExtension>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
368
            AbstractAdmin::class,
369
            AbstractAdminExtension::class,
370
            AdminExtensionInterface::class,
371
            AdminHelper::class,
372
            AdminInterface::class,
373
            BaseFieldDescription::class,
374
            FieldDescriptionCollection::class,
375
            FieldDescriptionInterface::class,
376
            Pool::class,
377
            AdminListBlockService::class,
378
            DatagridBuilderInterface::class,
379
            FormContractorInterface::class,
380
            ListBuilderInterface::class,
381
            RouteBuilderInterface::class,
382
            ShowBuilderInterface::class,
383
            Datagrid::class,
384
            DatagridInterface::class,
385
            DatagridMapper::class,
386
            ListMapper::class,
387
            Pager::class,
388
            PagerInterface::class,
389
            ProxyQueryInterface::class,
390
            ModelManagerException::class,
391
            NoValueException::class,
392
            Filter::class,
393
            FilterFactory::class,
394
            FilterFactoryInterface::class,
395
            FilterInterface::class,
396
            ArrayToModelTransformer::class,
397
            ModelsToArrayTransformer::class,
398
            ModelToIdTransformer::class,
399
            MergeCollectionListener::class,
400
            FormTypeFieldExtension::class,
401
            FormMapper::class,
402
            AdminType::class,
403
            ChoiceType::class,
404
            DateRangeType::class,
405
            DateTimeRangeType::class,
406
            DateTimeType::class,
407
            DateType::class,
408
            DefaultType::class,
409
            NumberType::class,
410
            ModelReferenceType::class,
411
            ModelType::class,
412
            ModelListType::class,
413
            TypeGuesserChain::class,
414
            TypeGuesserInterface::class,
415
            AuditManager::class,
416
            AuditManagerInterface::class,
417
            AuditReaderInterface::class,
418
            ModelManagerInterface::class,
419
            AdminPoolLoader::class,
420
            DefaultRouteGenerator::class,
421
            PathInfoBuilder::class,
422
            QueryStringBuilder::class,
423
            RouteCollection::class,
424
            RouteGeneratorInterface::class,
425
            AdminPermissionMap::class,
426
            MaskBuilder::class,
427
            AclSecurityHandler::class,
428
            AclSecurityHandlerInterface::class,
429
            NoopSecurityHandler::class,
430
            RoleSecurityHandler::class,
431
            SecurityHandlerInterface::class,
432
            ShowMapper::class,
433
            BCLabelTranslatorStrategy::class,
434
            FormLabelTranslatorStrategy::class,
435
            LabelTranslatorStrategyInterface::class,
436
            NativeLabelTranslatorStrategy::class,
437
            NoopLabelTranslatorStrategy::class,
438
            UnderscoreLabelTranslatorStrategy::class,
439
            TwigSonataAdminExtension::class,
440
            AdminAclManipulator::class,
441
            AdminAclManipulatorInterface::class,
442
            FormBuilderIterator::class,
443
            FormViewIterator::class,
444
            ObjectAclManipulator::class,
445
            ObjectAclManipulatorInterface::class,
446
        ]);
447
    }
448
449
    public function getNamespace()
450
    {
451
        return 'https://sonata-project.org/schema/dic/admin';
452
    }
453
454
    private function buildStylesheets($config)
455
    {
456
        return $this->mergeArray(
457
            $config['assets']['stylesheets'],
458
            $config['assets']['extra_stylesheets'],
459
            $config['assets']['remove_stylesheets']
460
        );
461
    }
462
463
    private function buildJavascripts($config)
464
    {
465
        return $this->mergeArray(
466
            $config['assets']['javascripts'],
467
            $config['assets']['extra_javascripts'],
468
            $config['assets']['remove_javascripts']
469
        );
470
    }
471
472
    private function mergeArray($array, $addArray, $removeArray = [])
473
    {
474
        foreach ($addArray as $toAdd) {
475
            array_push($array, $toAdd);
476
        }
477
        foreach ($removeArray as $toRemove) {
478
            if (in_array($toRemove, $array)) {
479
                array_splice($array, array_search($toRemove, $array), 1);
480
            }
481
        }
482
483
        return $array;
484
    }
485
486
    private function replacePropertyAccessor(ContainerBuilder $container)
487
    {
488
        if (!$container->has('form.property_accessor')) {
489
            return;
490
        }
491
492
        $pool = $container->getDefinition('sonata.admin.pool');
493
        $pool->replaceArgument(4, new Reference('form.property_accessor'));
494
495
        $modelChoice = $container->getDefinition('sonata.admin.form.type.model_choice');
496
        $modelChoice->replaceArgument(0, new Reference('form.property_accessor'));
497
    }
498
}
499