Completed
Pull Request — master (#21)
by Pavel
21:56
created

DoctrineOrmCompilerPass::process()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 23
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 13
CRAP Score 3.0032

Importance

Changes 2
Bugs 0 Features 0
Metric Value
dl 0
loc 23
ccs 13
cts 14
cp 0.9286
rs 9.0856
c 2
b 0
f 0
cc 3
eloc 14
nc 3
nop 1
crap 3.0032
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\ChildDefinition;
10
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
11
use Symfony\Component\DependencyInjection\ContainerBuilder;
12
use Symfony\Component\DependencyInjection\Definition;
13
use Symfony\Component\DependencyInjection\DefinitionDecorator;
14
use Symfony\Component\DependencyInjection\Loader;
15
use Symfony\Component\DependencyInjection\Reference;
16
17
final class DoctrineOrmCompilerPass implements CompilerPassInterface
18
{
19
    /** {@inheritdoc} */
20 30
    public function process(ContainerBuilder $container)
21
    {
22 30
        if (!$container->has('doctrine')) {
23
            return;
24
        }
25
26 30
        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__ . '/../../Resources/config'));
27 30
        $loader->load('doctrine.yml');
28
29 30
        $factory = $container->getDefinition('cruds.factory.reflection');
30 30
        $factory->setFactory([new Reference('cruds.factory.doctrine_reflection_factory'), 'create']);
31
32 30
        if ($container->has('serializer.normalizer.object')) {
33 30
            $converter = new Definition(EntityToIdNormalizer::class);
34 30
            $converter->setArguments([new Reference('doctrine')]);
35
36
            $container
37 30
                ->getDefinition('serializer.normalizer.object')
38 30
                ->addMethodCall('setCircularReferenceHandler', [[$converter, 'normalize']]);
39
40 30
            $this->registerModernNormalizer($container);
41
        }
42 30
    }
43
44
    /**
45
     * @param ContainerBuilder $container
46
     */
47 30
    private function registerModernNormalizer(ContainerBuilder $container)
48
    {
49 30
        $accessor          = new Reference('property_accessor');
50 30
        $registry          = new Reference('doctrine');
51 30
        $decoratedAccessor = new Definition(AssociationPropertyAccessor::class, [$accessor, $registry]);
52
53 30
        $container->setDefinition('cruds.doctrine.property_accessor', $decoratedAccessor);
54
55 30
        if (class_exists(ChildDefinition::class)) {
56 30
            $normalizer = new ChildDefinition('serializer.normalizer.object');
57
        } else {
58
            $normalizer = new DefinitionDecorator('serializer.normalizer.object');
59
        }
60
61 30
        $normalizer->setClass(DoctrineObjectNormalizer::class);
62 30
        $normalizer->addMethodCall('setRegistry', [$registry]);
63 30
        $normalizer->replaceArgument(2, new Reference('cruds.doctrine.property_accessor'));
64
65 30
        $normalizer->addTag('serializer.normalizer', ['priority' => -800]);
66
67 30
        $container->setDefinition('cruds.serializer.doctrine_object_normalizer', $normalizer);
68 30
    }
69
}
70