Completed
Push — master ( f2042d...10cdad )
by Kamil
29:04 queued 13:16
created

Driver/Doctrine/DoctrinePHPCRDriver.php (1 issue)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

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
declare(strict_types=1);
13
14
namespace Sylius\Bundle\ResourceBundle\DependencyInjection\Driver\Doctrine;
15
16
use Sylius\Bundle\ResourceBundle\Doctrine\ODM\PHPCR\EventListener\DefaultParentListener;
17
use Sylius\Bundle\ResourceBundle\Doctrine\ODM\PHPCR\EventListener\NameFilterListener;
18
use Sylius\Bundle\ResourceBundle\Doctrine\ODM\PHPCR\EventListener\NameResolverListener;
19
use Sylius\Bundle\ResourceBundle\SyliusResourceBundle;
20
use Sylius\Component\Resource\Metadata\MetadataInterface;
21
use Symfony\Component\DependencyInjection\ContainerBuilder;
22
use Symfony\Component\DependencyInjection\Definition;
23
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
24
use Symfony\Component\DependencyInjection\Parameter;
25
use Symfony\Component\DependencyInjection\Reference;
26
27
final class DoctrinePHPCRDriver extends AbstractDoctrineDriver
28
{
29
    /**
30
     * {@inheritdoc}
31
     */
32
    public function load(ContainerBuilder $container, MetadataInterface $metadata): void
33
    {
34
        parent::load($container, $metadata);
35
        $this->addResourceListeners($container, $metadata);
36
    }
37
38
    /**
39
     * @param ContainerBuilder $container
40
     * @param MetadataInterface $metadata
41
     */
42
    protected function addResourceListeners(ContainerBuilder $container, MetadataInterface $metadata): void
43
    {
44
        $defaultOptions = [
45
                // if no parent is given default to the parent path given here.
46
                'parent_path_default' => null,
47
48
                // auto-create the parent path if it does not exist.
49
                'parent_path_autocreate' => false,
50
51
                // set true to always override the parent path.
52
                'parent_path_force' => false,
53
54
                // automatically replace invalid characters in the node name
55
                // with a blank space.
56
                'name_filter' => true,
57
58
                // automatically resolve same-name-sibling conflicts.
59
                'name_resolver' => true,
60
        ];
61
        $metadataOptions = $metadata->hasParameter('options') ? $metadata->getParameter('options') : [];
62
63
        if ($diff = array_diff(array_keys($metadataOptions), array_keys($defaultOptions))) {
64
            throw new InvalidArgumentException(sprintf(
65
                'Unknown PHPCR-ODM configuration options: "%s"',
66
                implode('", "', $diff)
67
            ));
68
        }
69
70
        $options = array_merge(
71
            $defaultOptions,
72
            $metadataOptions
73
        );
74
75
        $createEventName = sprintf('%s.%s.pre_%s', $metadata->getApplicationName(), $metadata->getName(), 'create');
76
        $updateEventName = sprintf('%s.%s.pre_%s', $metadata->getApplicationName(), $metadata->getName(), 'update');
77
78
        if ($options['parent_path_default']) {
79
            $defaultPath = new Definition(DefaultParentListener::class);
80
            $defaultPath->setArguments([
81
                new Reference($metadata->getServiceId('manager')),
82
                $options['parent_path_default'],
83
                $options['parent_path_autocreate'],
84
                $options['parent_path_force'],
85
            ]);
86
            $defaultPath->addTag('kernel.event_listener', [
87
                'event' => $createEventName,
88
                'method' => 'onPreCreate',
89
            ]);
90
91
            $container->setDefinition(
92
                sprintf(
93
                    '%s.resource.%s.doctrine.odm.phpcr.event_listener.default_path',
94
                    $metadata->getApplicationName(),
95
                    $metadata->getName()
96
                ),
97
                $defaultPath
98
            );
99
        }
100
101
        if ($options['name_filter']) {
102
            $nameFilter = new Definition(NameFilterListener::class);
103
            $nameFilter->setArguments([
104
                new Reference($metadata->getServiceId('manager')),
105
            ]);
106
            $nameFilter->addTag('kernel.event_listener', [
107
                'event' => $createEventName,
108
                'method' => 'onEvent',
109
            ]);
110
            $nameFilter->addTag('kernel.event_listener', [
111
                'event' => $updateEventName,
112
                'method' => 'onEvent',
113
            ]);
114
115
            $container->setDefinition(
116
                sprintf(
117
                    '%s.resource.%s.doctrine.odm.phpcr.event_listener.name_filter',
118
                    $metadata->getApplicationName(),
119
                    $metadata->getName()
120
                ),
121
                $nameFilter
122
            );
123
        }
124
125
        if ($options['name_resolver']) {
126
            $nameResolver = new Definition(NameResolverListener::class);
127
            $nameResolver->setArguments([
128
                new Reference($metadata->getServiceId('manager')),
129
            ]);
130
            $nameResolver->addTag('kernel.event_listener', [
131
                'event' => $createEventName,
132
                'method' => 'onEvent',
133
            ]);
134
            $nameResolver->addTag('kernel.event_listener', [
135
                'event' => $updateEventName,
136
                'method' => 'onEvent',
137
            ]);
138
139
            $container->setDefinition(
140
                sprintf(
141
                    '%s.resource.%s.doctrine.odm.phpcr.event_listener.name_resolver',
142
                    $metadata->getApplicationName(),
143
                    $metadata->getName()
144
                ),
145
                $nameResolver
146
            );
147
        }
148
    }
149
150
    /**
151
     * {@inheritdoc}
152
     */
153
    public function getType(): string
154
    {
155
        return SyliusResourceBundle::DRIVER_DOCTRINE_PHPCR_ODM;
156
    }
157
158
    /**
159
     * {@inheritdoc}
160
     */
161
    protected function addRepository(ContainerBuilder $container, MetadataInterface $metadata): void
162
    {
163
        $repositoryClass = new Parameter('sylius.phpcr_odm.repository.class');
164
165
        if ($metadata->hasClass('repository')) {
166
            $repositoryClass = $metadata->getClass('repository');
167
        }
168
169
        $definition = new Definition($repositoryClass);
0 ignored issues
show
It seems like $repositoryClass defined by new \Symfony\Component\D..._odm.repository.class') on line 163 can also be of type object<Symfony\Component...ncyInjection\Parameter>; however, Symfony\Component\Depend...finition::__construct() does only seem to accept string|null, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
170
        $definition->setArguments([
171
            new Reference($metadata->getServiceId('manager')),
172
            $this->getClassMetadataDefinition($metadata),
173
        ]);
174
175
        $container->setDefinition($metadata->getServiceId('repository'), $definition);
176
    }
177
178
    /**
179
     * {@inheritdoc}
180
     */
181
    protected function getManagerServiceId(MetadataInterface $metadata): string
182
    {
183
        if ($objectManagerName = $this->getObjectManagerName($metadata)) {
184
            return sprintf('doctrine_phpcr.odm.%s_document_manager', $objectManagerName);
185
        }
186
187
        return 'doctrine_phpcr.odm.document_manager';
188
    }
189
190
    /**
191
     * {@inheritdoc}
192
     */
193
    protected function getClassMetadataClassname(): string
194
    {
195
        return 'Doctrine\\ODM\\PHPCR\\Mapping\\ClassMetadata';
196
    }
197
}
198