Completed
Push — symfony3-wololo ( ab614e )
by Kamil
65:18 queued 29:29
created

DoctrinePHPCRDriver::addDefaultForm()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 24
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 24
rs 8.9713
c 0
b 0
f 0
cc 1
eloc 16
nc 1
nop 2

1 Method

Rating   Name   Duplication   Size   Complexity  
A DoctrinePHPCRDriver::getClassMetadataClassname() 0 4 1
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\Driver\Doctrine;
13
14
use Sylius\Bundle\ResourceBundle\Doctrine\ODM\PHPCR\EventListener\DefaultParentListener;
15
use Sylius\Bundle\ResourceBundle\Doctrine\ODM\PHPCR\EventListener\NameFilterListener;
16
use Sylius\Bundle\ResourceBundle\Doctrine\ODM\PHPCR\EventListener\NameResolverListener;
17
use Sylius\Bundle\ResourceBundle\Doctrine\ODM\PHPCR\Form\Builder\DefaultFormBuilder;
18
use Sylius\Bundle\ResourceBundle\Form\Type\DefaultResourceType;
19
use Sylius\Bundle\ResourceBundle\SyliusResourceBundle;
20
use Sylius\Component\Resource\Metadata\MetadataInterface;
21
use Sylius\Component\Resource\Repository\TranslatableRepositoryInterface;
22
use Symfony\Component\DependencyInjection\ContainerBuilder;
23
use Symfony\Component\DependencyInjection\Definition;
24
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
25
use Symfony\Component\DependencyInjection\Parameter;
26
use Symfony\Component\DependencyInjection\Reference;
27
28
/**
29
 * @author Paweł Jędrzejewski <[email protected]>
30
 * @author Arnaud Langlade <[email protected]>
31
 */
32
final class DoctrinePHPCRDriver extends AbstractDoctrineDriver
33
{
34
    /**
35
     * {@inheritdoc}
36
     */
37
    public function load(ContainerBuilder $container, MetadataInterface $metadata)
38
    {
39
        parent::load($container, $metadata);
40
        $this->addResourceListeners($container, $metadata);
41
    }
42
43
    /**
44
     * @param ContainerBuilder $container
45
     * @param MetadataInterface $metadata
46
     */
47
    protected function addResourceListeners(ContainerBuilder $container, MetadataInterface $metadata)
48
    {
49
        $defaultOptions = [
50
                // if no parent is given default to the parent path given here.
51
                'parent_path_default' => null,
52
53
                // auto-create the parent path if it does not exist.
54
                'parent_path_autocreate' => false,
55
56
                // set true to always override the parent path.
57
                'parent_path_force' => false,
58
59
                // automatically replace invalid characters in the node name
60
                // with a blank space.
61
                'name_filter' => true,
62
63
                // automatically resolve same-name-sibling conflicts.
64
                'name_resolver' => true,
65
        ];
66
        $metadataOptions = $metadata->hasParameter('options') ? $metadata->getParameter('options') : [];
67
68
        if ($diff = array_diff(array_keys($metadataOptions), array_keys($defaultOptions))) {
69
            throw new InvalidArgumentException(sprintf(
70
                'Unknown PHPCR-ODM configuration options: "%s"',
71
                implode('", "', $diff)
72
            ));
73
        }
74
75
        $options = array_merge(
76
            $defaultOptions,
77
            $metadataOptions
78
        );
79
80
        $createEventName = sprintf('%s.%s.pre_%s', $metadata->getApplicationName(), $metadata->getName(), 'create');
81
        $updateEventName = sprintf('%s.%s.pre_%s', $metadata->getApplicationName(), $metadata->getName(), 'update');
82
83
        if ($options['parent_path_default']) {
84
            $defaultPath = new Definition(DefaultParentListener::class);
85
            $defaultPath->setArguments([
86
                new Reference($metadata->getServiceId('manager')),
87
                $options['parent_path_default'],
88
                $options['parent_path_autocreate'],
89
                $options['parent_path_force']
90
            ]);
91
            $defaultPath->addTag('kernel.event_listener', [
92
                'event' => $createEventName,
93
                'method' => 'onPreCreate'
94
            ]);
95
96
            $container->setDefinition(
97
                sprintf(
98
                    '%s.resource.%s.doctrine.odm.phpcr.event_listener.default_path',
99
                    $metadata->getApplicationName(),
100
                    $metadata->getName()
101
                ),
102
                $defaultPath
103
            );
104
        }
105
106
        if ($options['name_filter']) {
107
            $nameFilter = new Definition(NameFilterListener::class);
108
            $nameFilter->setArguments([
109
                new Reference($metadata->getServiceId('manager'))
110
            ]);
111
            $nameFilter->addTag('kernel.event_listener', [
112
                'event' => $createEventName,
113
                'method' => 'onEvent'
114
            ]);
115
            $nameFilter->addTag('kernel.event_listener', [
116
                'event' => $updateEventName,
117
                'method' => 'onEvent'
118
            ]);
119
120
            $container->setDefinition(
121
                sprintf(
122
                    '%s.resource.%s.doctrine.odm.phpcr.event_listener.name_filter',
123
                    $metadata->getApplicationName(),
124
                    $metadata->getName()
125
                ),
126
                $nameFilter
127
            );
128
        }
129
130
        if ($options['name_resolver']) {
131
            $nameResolver = new Definition(NameResolverListener::class);
132
            $nameResolver->setArguments([
133
                new Reference($metadata->getServiceId('manager'))
134
            ]);
135
            $nameResolver->addTag('kernel.event_listener', [
136
                'event' => $createEventName,
137
                'method' => 'onEvent'
138
            ]);
139
            $nameResolver->addTag('kernel.event_listener', [
140
                'event' => $updateEventName,
141
                'method' => 'onEvent'
142
            ]);
143
144
            $container->setDefinition(
145
                sprintf(
146
                    '%s.resource.%s.doctrine.odm.phpcr.event_listener.name_resolver',
147
                    $metadata->getApplicationName(),
148
                    $metadata->getName()
149
                ),
150
                $nameResolver
151
            );
152
        }
153
    }
154
155
    /**
156
     * {@inheritdoc}
157
     */
158
    public function getType()
159
    {
160
        return SyliusResourceBundle::DRIVER_DOCTRINE_PHPCR_ODM;
161
    }
162
163
    /**
164
     * {@inheritdoc}
165
     */
166
    protected function addRepository(ContainerBuilder $container, MetadataInterface $metadata)
167
    {
168
        $repositoryClass = new Parameter('sylius.phpcr_odm.repository.class');
169
170
        if ($metadata->hasClass('repository')) {
171
            $repositoryClass = $metadata->getClass('repository');
172
        }
173
174
        $definition = new Definition($repositoryClass);
175
        $definition->setArguments([
176
            new Reference($metadata->getServiceId('manager')),
177
            $this->getClassMetadataDefinition($metadata),
178
        ]);
179
180
        if ($metadata->hasParameter('translation')) {
181
            $translationConfig = $metadata->getParameter('translation');
182
183
            if (in_array(TranslatableRepositoryInterface::class, class_implements($repositoryClass))) {
184
                if (isset($translationConfig['fields'])) {
185
                    $definition->addMethodCall('setTranslatableFields', [$translationConfig['fields']]);
186
                }
187
            }
188
        }
189
190
        $container->setDefinition($metadata->getServiceId('repository'), $definition);
191
    }
192
193
    /**
194
     * {@inheritdoc}
195
     */
196
    protected function getManagerServiceId(MetadataInterface $metadata)
197
    {
198
        if ($objectManagerName = $this->getObjectManagerName($metadata)) {
199
            return sprintf('doctrine_phpcr.odm.%s_document_manager', $objectManagerName);
200
        }
201
202
        return 'doctrine_phpcr.odm.document_manager';
203
    }
204
205
    /**
206
     * {@inheritdoc}
207
     */
208
    protected function getClassMetadataClassname()
209
    {
210
        return 'Doctrine\\ODM\\PHPCR\\Mapping\\ClassMetadata';
211
    }
212
}
213