Completed
Push — master ( 607289...edbd19 )
by Pavel
01:31
created

DoctrineOrmCompilerPass   A

Complexity

Total Complexity 4

Size/Duplication

Total Lines 48
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 6

Test Coverage

Coverage 96.3%

Importance

Changes 0
Metric Value
wmc 4
lcom 0
cbo 6
dl 0
loc 48
ccs 26
cts 27
cp 0.963
rs 10
c 0
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
A process() 0 23 3
A registerModernNormalizer() 0 17 1
1
<?php
2
3
namespace ScayTrase\Api\Cruds\DependencyInjection\Compiler;
4
5
use ScayTrase\Api\Cruds\Adaptors\DoctrineOrm\AssociationPropertyAccessor;
6
use ScayTrase\Api\Cruds\Adaptors\DoctrineOrm\DoctrineObjectNormalizer;
7
use ScayTrase\Api\Cruds\Adaptors\DoctrineOrm\EntityToIdNormalizer;
8
use Symfony\Component\Config\FileLocator;
9
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
10
use Symfony\Component\DependencyInjection\ContainerBuilder;
11
use Symfony\Component\DependencyInjection\Definition;
12
use Symfony\Component\DependencyInjection\DefinitionDecorator;
13
use Symfony\Component\DependencyInjection\Loader;
14
use Symfony\Component\DependencyInjection\Reference;
15
16
final class DoctrineOrmCompilerPass implements CompilerPassInterface
17
{
18
    /** {@inheritdoc} */
19 2
    public function process(ContainerBuilder $container)
20
    {
21 2
        if (!$container->has('doctrine')) {
22
            return;
23
        }
24
25 2
        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__ . '/../../Resources/config'));
26 2
        $loader->load('doctrine.yml');
27
28 2
        $factory = $container->getDefinition('cruds.factory.reflection');
29 2
        $factory->setFactory([new Reference('cruds.factory.doctrine_reflection_factory'), 'create']);
30
31 2
        if ($container->has('serializer.normalizer.object')) {
32
33 1
            $converter = new Definition(EntityToIdNormalizer::class);
34 1
            $converter->setArguments([new Reference('doctrine')]);
35
36 1
            $container->getDefinition('serializer.normalizer.object')
37 1
                      ->addMethodCall('setCircularReferenceHandler', [[$converter, 'normalize']]);
38
39 1
            $this->registerModernNormalizer($container);
40 1
        }
41 2
    }
42
43
    /**
44
     * @param ContainerBuilder $container
45
     */
46 1
    private function registerModernNormalizer(ContainerBuilder $container)
47
    {
48 1
        $accessor          = new Reference('property_accessor');
49 1
        $registry          = new Reference('doctrine');
50 1
        $decoratedAccessor = new Definition(AssociationPropertyAccessor::class, [$accessor, $registry]);
51
52 1
        $container->setDefinition('cruds.doctrine.property_accessor', $decoratedAccessor);
53
54 1
        $normalizer = new DefinitionDecorator('serializer.normalizer.object');
55 1
        $normalizer->setClass(DoctrineObjectNormalizer::class);
56 1
        $normalizer->addMethodCall('setRegistry', [$registry]);
57 1
        $normalizer->replaceArgument(2, new Reference('cruds.doctrine.property_accessor'));
58
59 1
        $normalizer->addTag('serializer.normalizer', ['priority' => -800]);
60
61 1
        $container->setDefinition('cruds.serializer.doctrine_object_normalizer', $normalizer);
62 1
    }
63
}
64