AddChildCompilerPass::process()   B
last analyzed

Complexity

Conditions 7
Paths 16

Size

Total Lines 32
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 17
c 1
b 0
f 0
dl 0
loc 32
rs 8.8333
cc 7
nc 16
nop 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace KunicMarko\SonataAnnotationBundle\DependencyInjection\Compiler;
6
7
use KunicMarko\SonataAnnotationBundle\Reader\AddChildReader;
8
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
9
use Symfony\Component\DependencyInjection\ContainerBuilder;
10
11
/**
12
 * @author Marko Kunic <[email protected]>
13
 */
14
final class AddChildCompilerPass implements CompilerPassInterface
15
{
16
    use FindClassTrait;
17
18
    public function process(ContainerBuilder $container): void
19
    {
20
        /** @var AddChildReader $annotationReader */
21
        $annotationReader = $container->get('sonata.annotation.reader.add_child');
22
        /** @var string[] $admins */
23
        $admins = [];
24
        /** @var array[] $adminChildren */
25
        $adminChildren = [];
26
27
        foreach ($container->findTaggedServiceIds('sonata.admin') as $id => $tag) {
28
            if (!($class = $this->getClass($container, $id))) {
29
                continue;
30
            }
31
32
            $admins[$class] = $id;
33
34
            if ($children = $annotationReader->getChildren(new \ReflectionClass($class))) {
35
                $adminChildren[$id] = $children;
36
            }
37
        }
38
39
        foreach ($adminChildren as $id => $children) {
40
            foreach ($children as $class => $field) {
41
                if (!isset($admins[$class])) {
42
                    throw new \InvalidArgumentException(sprintf(
43
                        '%s is missing Admin Class.',
44
                        $class
45
                    ));
46
                }
47
48
                $definition = $container->getDefinition($id);
49
                $definition->addMethodCall('addChild', [$container->getDefinition($admins[$class]), $field]);
50
            }
51
        }
52
    }
53
}
54