Completed
Pull Request — master (#550)
by Asmir
03:00
created

DoctrinePass::process()   C

Complexity

Conditions 9
Paths 22

Size

Total Lines 46
Code Lines 28

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 34
CRAP Score 9

Importance

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