Completed
Branch resource-configuration-builder (c854d7)
by Kamil
13:53
created

ResourceConfigurationGenerator   A

Complexity

Total Complexity 25

Size/Duplication

Total Lines 227
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 8

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 25
c 1
b 0
f 0
lcom 1
cbo 8
dl 0
loc 227
rs 10

13 Methods

Rating   Name   Duplication   Size   Complexity  
A initResourcesConfiguration() 0 10 1
A addSyliusResource() 0 11 1
A addOptionsDefinition() 0 11 2
A addClassesDefinition() 0 11 1
A addValidationGroupsDefinition() 0 19 3
A addTranslationResourceDefinition() 0 14 2
A addTranslatableFieldsDefinition() 0 10 2
A addModelDefinition() 0 8 2
A addInterfaceDefinition() 0 8 2
A addControllerDefinition() 0 13 2
A addRepositoryDefinition() 0 13 2
A addFactoryDefinition() 0 13 2
A addFormsDefinitions() 0 21 3
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\ResourceBundle\DependencyInjection\Configuration;
13
14
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
15
16
/**
17
 * @author Kamil Kokot <[email protected]>
18
 */
19
class ResourceConfigurationGenerator implements ResourceConfigurationGeneratorInterface
20
{
21
    /**
22
     * {@inheritdoc}
23
     */
24
    public function initResourcesConfiguration(ArrayNodeDefinition $bundleRootDefinition)
25
    {
26
        $resourcesDefinition = $bundleRootDefinition
27
            ->children()
28
            ->arrayNode('resources')
29
            ->fixXmlConfig('resource')
30
        ;
31
32
        return $resourcesDefinition;
33
    }
34
35
    /**
36
     * {@inheritdoc}
37
     */
38
    public function addSyliusResource(ArrayNodeDefinition $resourcesDefinition, SyliusResource $syliusResource)
39
    {
40
        $resourceDefinition = $resourcesDefinition->children()->arrayNode($syliusResource->getName())->addDefaultsIfNotSet();
41
42
        $this->addOptionsDefinition($resourceDefinition, $syliusResource);
43
        $this->addClassesDefinition($resourceDefinition, $syliusResource);
44
        $this->addValidationGroupsDefinition($resourceDefinition, $syliusResource);
45
        $this->addTranslationResourceDefinition($resourceDefinition, $syliusResource);
46
47
        return $resourceDefinition;
48
    }
49
50
    /**
51
     * @param ArrayNodeDefinition $resourceDefinition
52
     * @param AbstractSyliusResource $syliusResource
53
     */
54
    private function addOptionsDefinition(ArrayNodeDefinition $resourceDefinition, AbstractSyliusResource $syliusResource)
55
    {
56
        $optionsDefinition = $resourceDefinition->children()->variableNode('options');
57
58
        $options = $syliusResource->getOptions();
59
        if (0 === count($options)) {
60
            return;
61
        }
62
63
        $optionsDefinition->defaultValue($options);
64
    }
65
66
    /**
67
     * @param ArrayNodeDefinition $resourceDefinition
68
     * @param AbstractSyliusResource $syliusResource
69
     */
70
    private function addClassesDefinition(ArrayNodeDefinition $resourceDefinition, AbstractSyliusResource $syliusResource)
71
    {
72
        $classesDefinition = $resourceDefinition->children()->arrayNode('classes')->addDefaultsIfNotSet();
73
74
        $this->addModelDefinition($classesDefinition, $syliusResource);
75
        $this->addInterfaceDefinition($classesDefinition, $syliusResource);
76
        $this->addControllerDefinition($classesDefinition, $syliusResource);
77
        $this->addRepositoryDefinition($classesDefinition, $syliusResource);
78
        $this->addFactoryDefinition($classesDefinition, $syliusResource);
79
        $this->addFormsDefinitions($classesDefinition, $syliusResource);
80
    }
81
82
    /**
83
     * @param ArrayNodeDefinition $resourceDefinition
84
     * @param AbstractSyliusResource $syliusResource
85
     */
86
    private function addValidationGroupsDefinition(ArrayNodeDefinition $resourceDefinition, AbstractSyliusResource $syliusResource)
87
    {
88
        if (0 === count($syliusResource->getValidationGroups())) {
89
            return;
90
        }
91
92
        $validationGroupsNodeBuilder = $resourceDefinition
93
            ->children()
94
            ->arrayNode('validation_groups')
95
            ->addDefaultsIfNotSet()
96
            ->children()
97
        ;
98
99
        foreach ($syliusResource->getValidationGroups() as $name => $validationGroups) {
100
            $validationGroupsDefinition = $validationGroupsNodeBuilder->arrayNode($name);
101
            $validationGroupsDefinition->defaultValue($validationGroups);
102
            $validationGroupsDefinition->prototype('scalar');
103
        }
104
    }
105
106
    /**
107
     * @param ArrayNodeDefinition $resourceDefinition
108
     * @param SyliusResource $syliusResource
109
     */
110
    private function addTranslationResourceDefinition(ArrayNodeDefinition $resourceDefinition, SyliusResource $syliusResource)
111
    {
112
        if (null === $syliusResource->getTranslationResource()) {
113
            return;
114
        }
115
116
        $syliusTranslationResource = $syliusResource->getTranslationResource();
117
        $translationDefinition = $resourceDefinition->children()->arrayNode('translation')->addDefaultsIfNotSet();
118
119
        $this->addOptionsDefinition($translationDefinition, $syliusTranslationResource);
120
        $this->addClassesDefinition($translationDefinition, $syliusTranslationResource);
121
        $this->addValidationGroupsDefinition($translationDefinition, $syliusTranslationResource);
122
        $this->addTranslatableFieldsDefinition($translationDefinition, $syliusTranslationResource);
123
    }
124
125
    /**
126
     * @param ArrayNodeDefinition $translationResourceDefinition
127
     * @param SyliusTranslationResource $syliusTranslationResource
128
     */
129
    private function addTranslatableFieldsDefinition(ArrayNodeDefinition $translationResourceDefinition, SyliusTranslationResource $syliusTranslationResource)
130
    {
131
        if (0 === count($syliusTranslationResource->getTranslatableFields())) {
132
            return;
133
        }
134
135
        $translatableFieldsDefinition = $translationResourceDefinition->children()->arrayNode('fields');
136
        $translatableFieldsDefinition->defaultValue($syliusTranslationResource->getTranslatableFields());
137
        $translatableFieldsDefinition->prototype('scalar');
138
    }
139
140
    /**
141
     * @param ArrayNodeDefinition $classesDefinition
142
     * @param AbstractSyliusResource $syliusResource
143
     */
144
    private function addModelDefinition(ArrayNodeDefinition $classesDefinition, AbstractSyliusResource $syliusResource)
145
    {
146
        $modelDefinition = $classesDefinition->children()->scalarNode('model')->cannotBeEmpty();
147
148
        if (null !== $syliusResource->getModelClass()) {
149
            $modelDefinition->defaultValue($syliusResource->getModelClass());
150
        }
151
    }
152
153
    /**
154
     * @param ArrayNodeDefinition $classesDefinition
155
     * @param AbstractSyliusResource $syliusResource
156
     */
157
    private function addInterfaceDefinition(ArrayNodeDefinition $classesDefinition, AbstractSyliusResource $syliusResource)
158
    {
159
        $interfaceDefinition = $classesDefinition->children()->scalarNode('interface')->cannotBeEmpty();
160
161
        if (null !== $syliusResource->getInterfaceClass()) {
162
            $interfaceDefinition->defaultValue($syliusResource->getInterfaceClass());
163
        }
164
    }
165
166
    /**
167
     * @param ArrayNodeDefinition $classesDefinition
168
     * @param AbstractSyliusResource $syliusResource
169
     */
170
    private function addControllerDefinition(ArrayNodeDefinition $classesDefinition, AbstractSyliusResource $syliusResource)
171
    {
172
        if (null === $syliusResource->getControllerClass()) {
173
            return;
174
        }
175
176
        $classesDefinition
177
            ->children()
178
            ->scalarNode('controller')
179
            ->defaultValue($syliusResource->getControllerClass())
180
            ->cannotBeEmpty()
181
        ;
182
    }
183
184
    /**
185
     * @param ArrayNodeDefinition $classesDefinition
186
     * @param AbstractSyliusResource $syliusResource
187
     */
188
    private function addRepositoryDefinition(ArrayNodeDefinition $classesDefinition, AbstractSyliusResource $syliusResource)
189
    {
190
        if (null === $syliusResource->getRepositoryClass()) {
191
            return;
192
        }
193
194
        $classesDefinition
195
            ->children()
196
            ->scalarNode('repository')
197
            ->defaultValue($syliusResource->getRepositoryClass())
198
            ->cannotBeEmpty()
199
        ;
200
    }
201
202
    /**
203
     * @param ArrayNodeDefinition $classesDefinition
204
     * @param AbstractSyliusResource $syliusResource
205
     */
206
    private function addFactoryDefinition(ArrayNodeDefinition $classesDefinition, AbstractSyliusResource $syliusResource)
207
    {
208
        if (null === $syliusResource->getFactoryClass()) {
209
            return;
210
        }
211
212
        $classesDefinition
213
            ->children()
214
            ->scalarNode('factory')
215
            ->defaultValue($syliusResource->getFactoryClass())
216
            ->cannotBeEmpty()
217
        ;
218
    }
219
220
    /**
221
     * @param ArrayNodeDefinition $classesDefinition
222
     * @param AbstractSyliusResource $syliusResource
223
     */
224
    private function addFormsDefinitions(ArrayNodeDefinition $classesDefinition, AbstractSyliusResource $syliusResource)
225
    {
226
        if (0 === count($syliusResource->getFormsClasses())) {
227
            return;
228
        }
229
230
        $formsNodeBuilder = $classesDefinition
231
            ->children()
232
            ->arrayNode('form')
233
            ->addDefaultsIfNotSet()
234
            ->children()
235
        ;
236
237
        foreach ($syliusResource->getFormsClasses() as $name => $formClass) {
238
            $formsNodeBuilder
239
                ->scalarNode($name)
240
                ->defaultValue($formClass)
241
                ->cannotBeEmpty()
242
            ;
243
        }
244
    }
245
}
246