Completed
Push — master ( 59db0f...abafe8 )
by Kamil
18:55
created

SyliusArchetypeExtension::load()   C

Complexity

Conditions 7
Paths 20

Size

Total Lines 35
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 35
rs 6.7272
cc 7
eloc 19
nc 20
nop 2
1
<?php
2
3
/*
4
 * This file is part of the Sylius package.
5
 *
6
 * (c) Paweł Jędrzejewski
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Sylius\Bundle\ArchetypeBundle\DependencyInjection;
13
14
use Sylius\Bundle\ArchetypeBundle\Doctrine\ORM\ArchetypeRepository;
15
use Sylius\Bundle\ResourceBundle\DependencyInjection\Extension\AbstractResourceExtension;
16
use Sylius\Bundle\ResourceBundle\SyliusResourceBundle;
17
use Sylius\Component\Archetype\Builder\ArchetypeBuilder;
18
use Symfony\Component\Config\FileLocator;
19
use Symfony\Component\DependencyInjection\ContainerBuilder;
20
use Symfony\Component\DependencyInjection\Definition;
21
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
22
use Symfony\Component\DependencyInjection\Reference;
23
24
/**
25
 * Archetype extension.
26
 *
27
 * @author Adam Elsodaney <[email protected]>
28
 */
29
class SyliusArchetypeExtension extends AbstractResourceExtension
30
{
31
    /**
32
     * {@inheritdoc}
33
     */
34
    public function load(array $config, ContainerBuilder $container)
35
    {
36
        $config = $this->processConfiguration(new Configuration(), $config);
37
        $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
38
39
        if (SyliusResourceBundle::DRIVER_DOCTRINE_ORM === $config['driver']) {
40
            $config = $this->defineDefaultOrmRepository($config);
41
        }
42
43
        $this->registerResources('sylius', $config['driver'], $this->resolveResources($config['resources'], $container), $container);
44
45
        foreach ($config['resources'] as $subjectName => $subjectConfig) {
46
            foreach ($subjectConfig as $resourceName => $resourceConfig) {
47
                if (!is_array($resourceConfig)) {
48
                    continue;
49
                }
50
51
                $formDefinition = $container->getDefinition('sylius.form.type.'.$subjectName.'_'.$resourceName);
52
                $formDefinition->addArgument($subjectName);
53
54
                if (isset($resourceConfig['translation'])) {
55
                    $formTranslationDefinition = $container->getDefinition('sylius.form.type.'.$subjectName.'_'.$resourceName.'_translation');
56
                    $formTranslationDefinition->addArgument($subjectName);
57
                }
58
            }
59
        }
60
61
        $configFiles = [
62
            'services.xml',
63
        ];
64
65
        foreach ($configFiles as $configFile) {
66
            $loader->load($configFile);
67
        }
68
    }
69
70
    /**
71
     * Resolve resources for every subject.
72
     *
73
     * @param array $resources
74
     * @param ContainerBuilder $container
75
     *
76
     * @return array
77
     */
78
    private function resolveResources(array $resources, ContainerBuilder $container)
79
    {
80
        $subjects = [];
81
82
        foreach ($resources as $subject => $parameters) {
83
            $subjects[$subject] = $parameters;
84
        }
85
86
        $container->setParameter('sylius.archetype.subjects', $subjects);
87
88
        $resolvedResources = [];
89
90
        foreach ($resources as $subjectName => $subjectConfig) {
91
            $this->createPrototypeBuilder($container, $subjectName);
92
93
            foreach ($subjectConfig as $resourceName => $resourceConfig) {
94
                if (is_array($resourceConfig)) {
95
                    $resolvedResources[$subjectName.'_'.$resourceName] = $resourceConfig;
96
                }
97
            }
98
        }
99
100
        return $resolvedResources;
101
    }
102
103
    /**
104
     * Create prototype builder for subject.
105
     *
106
     * @param ContainerBuilder $container
107
     * @param string $subjectName
108
     */
109
    private function createPrototypeBuilder(ContainerBuilder $container, $subjectName)
110
    {
111
        $builderDefinition = new Definition(ArchetypeBuilder::class);
112
        $builderDefinition
113
            ->setArguments([new Reference(sprintf('sylius.factory.%s_attribute_value', $subjectName))])
114
        ;
115
116
        $container->setDefinition('sylius.builder.'.$subjectName.'_archetype', $builderDefinition);
117
    }
118
119
    /**
120
     * @param array $config
121
     *
122
     * @return array
123
     */
124
    private function defineDefaultOrmRepository(array $config)
125
    {
126
        foreach ($config['resources'] as $subjectName => $subjectConfig) {
127
            if (!isset($subjectConfig['archetype']['classes']['repository'])) {
128
                $config['resources'][$subjectName]['archetype']['classes']['repository'] = ArchetypeRepository::class;
129
            }
130
        }
131
132
        return $config;
133
    }
134
}
135