Completed
Pull Request — master (#550)
by Asmir
13:51
created

DoctrinePass::process()   C

Complexity

Conditions 9
Paths 22

Size

Total Lines 46
Code Lines 28

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 13
CRAP Score 25.9506

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 46
ccs 13
cts 32
cp 0.4063
rs 5.0942
cc 9
eloc 28
nc 22
nop 1
crap 25.9506
1
<?php
2
3
namespace JMS\SerializerBundle\DependencyInjection\Compiler;
4
5
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
6
use Symfony\Component\DependencyInjection\ContainerBuilder;
7
use Symfony\Component\DependencyInjection\Reference;
8
9
class DoctrinePass implements CompilerPassInterface
10
{
11 13
    public function process(ContainerBuilder $container)
12
    {
13 13
        if ($container->hasParameter('jms_serializer.infer_types_from_doctrine_metadata')
14 13
            && $container->getParameter('jms_serializer.infer_types_from_doctrine_metadata') === false
15
        ) {
16
            return;
17
        }
18
19 13
        $registries = array(
20 13
            'doctrine.orm.entity_manager' => 'doctrine',
21 13
            'doctrine_phpcr.odm.document_manager' => 'doctrine_phpcr',
22
        );
23 13
24 13
        foreach ($registries as $managerId => $registry) {
25 13
            if (!$container->has($managerId)) {
26 13
                unset($registries[$managerId]);
27 13
            }
28
        }
29 13
30 13
        if (empty($registries)) {
31
            return;
32
        }
33
34
        $serviceTemplates = array(
35
            'jms_serializer.metadata_driver' => array('template' => 'jms_serializer.metadata.%s_type_driver', 'position' => 0),
36
            'jms_serializer.object_constructor' => array('template' => 'jms_serializer.%s_object_constructor', 'position' => 1)
37
        );
38
39
        $registry = array_pop($registries);
40
        $previousId = array();
41
        foreach ($serviceTemplates as $serviceName => $service) {
42
            $previousId[$serviceName] = sprintf($service['template'], $registry);
43
            $container->setAlias($serviceName, $previousId[$serviceName]);
44
        }
45
46
        foreach ($registries as $registry) {
47
            foreach ($serviceTemplates as $serviceName => $service) {
48
                $id = sprintf($service['template'], $registry);
49
                $container
50
                    ->getDefinition($id)
51
                    ->replaceArgument($service['position'], new Reference($previousId[$serviceName]));
52
                $previousId[$serviceName] = $id;
53
                $container->setAlias($serviceName, $previousId[$serviceName]);
54
            }
55
        }
56
    }
57
}
58