Completed
Pull Request — master (#1661)
by Andreas
08:41 queued 03:51
created

AnnotationDriver::loadMetadataForClass()   F

Complexity

Conditions 66
Paths > 20000

Size

Total Lines 194
Code Lines 127

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 113
CRAP Score 71.8295

Importance

Changes 0
Metric Value
dl 0
loc 194
ccs 113
cts 127
cp 0.8898
rs 2
c 0
b 0
f 0
cc 66
eloc 127
nc 147972150
nop 2
crap 71.8295

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
/*
3
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
4
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
5
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
6
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
7
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
8
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
9
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
10
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
11
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
12
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
13
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
14
 *
15
 * This software consists of voluntary contributions made by many individuals
16
 * and is licensed under the MIT license. For more information, see
17
 * <http://www.doctrine-project.org>.
18
 */
19
20
namespace Doctrine\ODM\MongoDB\Mapping\Driver;
21
22
use Doctrine\Common\Annotations\AnnotationReader;
23
use Doctrine\Common\Annotations\AnnotationRegistry;
24
use Doctrine\Common\Annotations\Reader;
25
use Doctrine\Common\Persistence\Mapping\ClassMetadata;
26
use Doctrine\Common\Persistence\Mapping\Driver\AnnotationDriver as AbstractAnnotationDriver;
27
use Doctrine\ODM\MongoDB\Events;
28
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
29
use Doctrine\ODM\MongoDB\Mapping\ClassMetadata as MappingClassMetadata;
30
use Doctrine\ODM\MongoDB\Mapping\ClassMetadataInfo;
31
use Doctrine\ODM\MongoDB\Mapping\MappingException;
32
33
/**
34
 * The AnnotationDriver reads the mapping metadata from docblock annotations.
35
 *
36
 * @since       1.0
37
 */
38
class AnnotationDriver extends AbstractAnnotationDriver
39
{
40
    protected $entityAnnotationClasses = array(
41
        ODM\Document::class            => 1,
42
        ODM\MappedSuperclass::class    => 2,
43
        ODM\EmbeddedDocument::class    => 3,
44
        ODM\QueryResultDocument::class => 4,
45
    );
46
47
    /**
48
     * Registers annotation classes to the common registry.
49
     *
50
     * This method should be called when bootstrapping your application.
51
     *
52
     * @deprecated method was deprecated in 1.2 and will be removed in 2.0. Register class loader through AnnotationRegistry::registerLoader instead.
53
     */
54
    public static function registerAnnotationClasses()
55
    {
56
        @trigger_error(
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition here. This can introduce security issues, and is generally not recommended.

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
57
            sprintf('%s is deprecated - register class loader through AnnotationRegistry::registerLoader instead.', __METHOD__),
58
            E_USER_DEPRECATED
59
        );
60
        AnnotationRegistry::registerFile(__DIR__ . '/../Annotations/DoctrineAnnotations.php');
0 ignored issues
show
Deprecated Code introduced by
The method Doctrine\Common\Annotati...egistry::registerFile() has been deprecated with message: this method is deprecated and will be removed in doctrine/annotations 2.0 autoloading should be deferred to the globally registered autoloader by then. For now, use @example AnnotationRegistry::registerLoader('class_exists')

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
61
    }
62
63
    /**
64
     * {@inheritdoc}
65
     */
66 936
    public function loadMetadataForClass($className, ClassMetadata $class)
67
    {
68
        /** @var $class ClassMetadataInfo */
69 936
        $reflClass = $class->getReflectionClass();
70
71 936
        $classAnnotations = $this->reader->getClassAnnotations($reflClass);
72
73 936
        $documentAnnots = array();
74 936
        foreach ($classAnnotations as $annot) {
75 934
            $classAnnotations[get_class($annot)] = $annot;
76
77 934
            foreach ($this->entityAnnotationClasses as $annotClass => $i) {
78 934
                if ($annot instanceof $annotClass) {
79 934
                    $documentAnnots[$i] = $annot;
80 934
                    continue 2;
81
                }
82
            }
83
84
            // non-document class annotations
85 418
            if ($annot instanceof ODM\AbstractIndex) {
86 13
                $this->addIndex($class, $annot);
87
            }
88 418
            if ($annot instanceof ODM\Indexes) {
89 65
                foreach (is_array($annot->value) ? $annot->value : array($annot->value) as $index) {
90 65
                    $this->addIndex($class, $index);
91
                }
92 407
            } elseif ($annot instanceof ODM\InheritanceType) {
93 322
                $class->setInheritanceType(constant(MappingClassMetadata::class . '::INHERITANCE_TYPE_'.$annot->value));
94 405
            } elseif ($annot instanceof ODM\DiscriminatorField) {
95
                // $fieldName property is deprecated, but fall back for BC
96 121
                if (isset($annot->value)) {
97 121
                    $class->setDiscriminatorField($annot->value);
0 ignored issues
show
Bug introduced by
It seems like $annot->value can also be of type array; however, Doctrine\ODM\MongoDB\Map...setDiscriminatorField() does only seem to accept string, 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...
98
                } elseif (isset($annot->name)) {
0 ignored issues
show
Deprecated Code introduced by
The property Doctrine\ODM\MongoDB\Map...scriminatorField::$name has been deprecated with message: property was deprecated in 1.2 and will be removed in 2.0

This property has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the property will be removed from the class and what other property to use instead.

Loading history...
99
                    @trigger_error(
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition here. This can introduce security issues, and is generally not recommended.

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
100
                        sprintf('Specifying discriminator\'s name through "name" is deprecated - use @DiscriminatorField("%s") instead', $annot->name),
0 ignored issues
show
Deprecated Code introduced by
The property Doctrine\ODM\MongoDB\Map...scriminatorField::$name has been deprecated with message: property was deprecated in 1.2 and will be removed in 2.0

This property has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the property will be removed from the class and what other property to use instead.

Loading history...
101
                        E_USER_DEPRECATED
102
                    );
103
                    $class->setDiscriminatorField($annot->name);
0 ignored issues
show
Deprecated Code introduced by
The property Doctrine\ODM\MongoDB\Map...scriminatorField::$name has been deprecated with message: property was deprecated in 1.2 and will be removed in 2.0

This property has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the property will be removed from the class and what other property to use instead.

Loading history...
104
                } elseif (isset($annot->fieldName)) {
0 ignored issues
show
Deprecated Code introduced by
The property Doctrine\ODM\MongoDB\Map...inatorField::$fieldName has been deprecated with message: property was deprecated in 1.0.0-BETA10 and will be removed in 2.0

This property has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the property will be removed from the class and what other property to use instead.

Loading history...
105
                    @trigger_error(
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition here. This can introduce security issues, and is generally not recommended.

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
106
                        sprintf('Specifying discriminator\'s name through "name" is deprecated - use @DiscriminatorField("%s") instead', $annot->fieldName),
0 ignored issues
show
Deprecated Code introduced by
The property Doctrine\ODM\MongoDB\Map...inatorField::$fieldName has been deprecated with message: property was deprecated in 1.0.0-BETA10 and will be removed in 2.0

This property has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the property will be removed from the class and what other property to use instead.

Loading history...
107
                        E_USER_DEPRECATED
108
                    );
109 121
                    $class->setDiscriminatorField($annot->fieldName);
0 ignored issues
show
Deprecated Code introduced by
The property Doctrine\ODM\MongoDB\Map...inatorField::$fieldName has been deprecated with message: property was deprecated in 1.0.0-BETA10 and will be removed in 2.0

This property has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the property will be removed from the class and what other property to use instead.

Loading history...
110
                }
111 404
            } elseif ($annot instanceof ODM\DiscriminatorMap) {
112 121
                $class->setDiscriminatorMap($annot->value);
0 ignored issues
show
Bug introduced by
It seems like $annot->value can also be of type null or string; however, Doctrine\ODM\MongoDB\Map...::setDiscriminatorMap() does only seem to accept array, 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...
113 342
            } elseif ($annot instanceof ODM\DiscriminatorValue) {
114
                $class->setDiscriminatorValue($annot->value);
0 ignored issues
show
Bug introduced by
It seems like $annot->value can also be of type array or null; however, Doctrine\ODM\MongoDB\Map...setDiscriminatorValue() does only seem to accept string, 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...
115 342
            } elseif ($annot instanceof ODM\ChangeTrackingPolicy) {
116 57
                $class->setChangeTrackingPolicy(constant(MappingClassMetadata::class . '::CHANGETRACKING_'.$annot->value));
117 339
            } elseif ($annot instanceof ODM\DefaultDiscriminatorValue) {
118 57
                $class->setDefaultDiscriminatorValue($annot->value);
0 ignored issues
show
Bug introduced by
It seems like $annot->value can also be of type array or null; however, Doctrine\ODM\MongoDB\Map...ultDiscriminatorValue() does only seem to accept string, 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...
119 334
            } elseif ($annot instanceof ODM\ReadPreference) {
120 418
                $class->setReadPreference($annot->value, $annot->tags);
0 ignored issues
show
Bug introduced by
It seems like $annot->value can also be of type array or null; however, Doctrine\ODM\MongoDB\Map...fo::setReadPreference() does only seem to accept string, 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...
121
            }
122
123
        }
124
125 936
        if ( ! $documentAnnots) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $documentAnnots of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
126 3
            throw MappingException::classIsNotAValidDocument($className);
127
        }
128
129
        // find the winning document annotation
130 934
        ksort($documentAnnots);
131 934
        $documentAnnot = reset($documentAnnots);
132
133 934
        if ($documentAnnot instanceof ODM\MappedSuperclass) {
134 312
            $class->isMappedSuperclass = true;
135 933
        } elseif ($documentAnnot instanceof ODM\EmbeddedDocument) {
136 298
            $class->isEmbeddedDocument = true;
137 926
        } elseif ($documentAnnot instanceof ODM\QueryResultDocument) {
138 52
            $class->isQueryResultDocument = true;
139
        }
140 934
        if (isset($documentAnnot->db)) {
141 1
            $class->setDatabase($documentAnnot->db);
142
        }
143 934
        if (isset($documentAnnot->collection)) {
144 370
            $class->setCollection($documentAnnot->collection);
145
        }
146 934
        if (isset($documentAnnot->repositoryClass)) {
147 69
            $class->setCustomRepositoryClass($documentAnnot->repositoryClass);
148
        }
149 934
        if (isset($documentAnnot->writeConcern)) {
150 11
            $class->setWriteConcern($documentAnnot->writeConcern);
151
        }
152 934
        if (isset($documentAnnot->indexes)) {
153 933
            foreach ($documentAnnot->indexes as $index) {
154
                $this->addIndex($class, $index);
155
            }
156
        }
157 934
        if (isset($documentAnnot->requireIndexes)) {
158 926
            $class->setRequireIndexes($documentAnnot->requireIndexes);
0 ignored issues
show
Deprecated Code introduced by
The method Doctrine\ODM\MongoDB\Map...fo::setRequireIndexes() has been deprecated with message: method was deprecated in 1.2 and will be removed in 2.0

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
159
        }
160 934
        if (isset($documentAnnot->slaveOkay)) {
161 1
            $class->setSlaveOkay($documentAnnot->slaveOkay);
0 ignored issues
show
Deprecated Code introduced by
The method Doctrine\ODM\MongoDB\Map...ataInfo::setSlaveOkay() has been deprecated with message: in version 1.2 and will be removed in 2.0.

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
162
        }
163 934
        if (! empty($documentAnnot->readOnly)) {
164 6
            $class->markReadOnly();
165
        }
166
167 934
        foreach ($reflClass->getProperties() as $property) {
168 933
            if (($class->isMappedSuperclass && ! $property->isPrivate())
169
                ||
170 933
                ($class->isInheritedField($property->name) && $property->getDeclaringClass()->name !== $class->name)) {
171 356
                continue;
172
            }
173
174 932
            $indexes = array();
175 932
            $mapping = array('fieldName' => $property->getName());
176 932
            $fieldAnnot = null;
177
178 932
            foreach ($this->reader->getPropertyAnnotations($property) as $annot) {
179 932
                if ($annot instanceof ODM\AbstractField) {
180 932
                    $fieldAnnot = $annot;
181 932
                    if ($annot->isDeprecated()) {
182
                        @trigger_error($annot->getDeprecationMessage(), E_USER_DEPRECATED);
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition here. This can introduce security issues, and is generally not recommended.

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
183
                    }
184
                }
185 932
                if ($annot instanceof ODM\AbstractIndex) {
186 201
                    $indexes[] = $annot;
187
                }
188 932
                if ($annot instanceof ODM\Indexes) {
189
                    foreach (is_array($annot->value) ? $annot->value : array($annot->value) as $index) {
190
                        $indexes[] = $index;
191
                    }
192 932
                } elseif ($annot instanceof ODM\AlsoLoad) {
193 15
                    $mapping['alsoLoadFields'] = (array) $annot->value;
194 932
                } elseif ($annot instanceof ODM\Version) {
195 99
                    $mapping['version'] = true;
196 932
                } elseif ($annot instanceof ODM\Lock) {
197 932
                    $mapping['lock'] = true;
198
                }
199
            }
200
201 932
            if ($fieldAnnot) {
202 932
                $mapping = array_replace($mapping, (array) $fieldAnnot);
203 932
                $class->mapField($mapping);
204
            }
205
206 932
            if ($indexes) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $indexes of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
207 201
                foreach ($indexes as $index) {
208 201
                    $name = isset($mapping['name']) ? $mapping['name'] : $mapping['fieldName'];
209 201
                    $keys = array($name => $index->order ?: 'asc');
210 932
                    $this->addIndex($class, $index, $keys);
211
                }
212
            }
213
        }
214
215
        // Set shard key after all fields to ensure we mapped all its keys
216 932
        if (isset($classAnnotations['Doctrine\ODM\MongoDB\Mapping\Annotations\ShardKey'])) {
217 72
            $this->setShardKey($class, $classAnnotations['Doctrine\ODM\MongoDB\Mapping\Annotations\ShardKey']);
218
        }
219
220
        /** @var $method \ReflectionMethod */
221 931
        foreach ($reflClass->getMethods(\ReflectionMethod::IS_PUBLIC) as $method) {
222
            /* Filter for the declaring class only. Callbacks from parent
223
             * classes will already be registered.
224
             */
225 650
            if ($method->getDeclaringClass()->name !== $reflClass->name) {
226 323
                continue;
227
            }
228
229 650
            foreach ($this->reader->getMethodAnnotations($method) as $annot) {
230 316
                if ($annot instanceof ODM\AlsoLoad) {
231 13
                    $class->registerAlsoLoadMethod($method->getName(), $annot->value);
0 ignored issues
show
Bug introduced by
It seems like $annot->value can also be of type null; however, Doctrine\ODM\MongoDB\Map...egisterAlsoLoadMethod() does only seem to accept array|string, 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...
Bug introduced by
Consider using $method->name. There is an issue with getName() and APC-enabled PHP versions.
Loading history...
232
                }
233
234 316
                if ( ! isset($classAnnotations[ODM\HasLifecycleCallbacks::class])) {
235 72
                    continue;
236
                }
237
238 297
                if ($annot instanceof ODM\PrePersist) {
239 276
                    $class->addLifecycleCallback($method->getName(), Events::prePersist);
0 ignored issues
show
Bug introduced by
Consider using $method->name. There is an issue with getName() and APC-enabled PHP versions.
Loading history...
240 86
                } elseif ($annot instanceof ODM\PostPersist) {
241 11
                    $class->addLifecycleCallback($method->getName(), Events::postPersist);
0 ignored issues
show
Bug introduced by
Consider using $method->name. There is an issue with getName() and APC-enabled PHP versions.
Loading history...
242 85
                } elseif ($annot instanceof ODM\PreUpdate) {
243 15
                    $class->addLifecycleCallback($method->getName(), Events::preUpdate);
0 ignored issues
show
Bug introduced by
Consider using $method->name. There is an issue with getName() and APC-enabled PHP versions.
Loading history...
244 80
                } elseif ($annot instanceof ODM\PostUpdate) {
245 67
                    $class->addLifecycleCallback($method->getName(), Events::postUpdate);
0 ignored issues
show
Bug introduced by
Consider using $method->name. There is an issue with getName() and APC-enabled PHP versions.
Loading history...
246 74
                } elseif ($annot instanceof ODM\PreRemove) {
247 72
                    $class->addLifecycleCallback($method->getName(), Events::preRemove);
0 ignored issues
show
Bug introduced by
Consider using $method->name. There is an issue with getName() and APC-enabled PHP versions.
Loading history...
248 74
                } elseif ($annot instanceof ODM\PostRemove) {
249 70
                    $class->addLifecycleCallback($method->getName(), Events::postRemove);
0 ignored issues
show
Bug introduced by
Consider using $method->name. There is an issue with getName() and APC-enabled PHP versions.
Loading history...
250 74
                } elseif ($annot instanceof ODM\PreLoad) {
251 71
                    $class->addLifecycleCallback($method->getName(), Events::preLoad);
0 ignored issues
show
Bug introduced by
Consider using $method->name. There is an issue with getName() and APC-enabled PHP versions.
Loading history...
252 73
                } elseif ($annot instanceof ODM\PostLoad) {
253 72
                    $class->addLifecycleCallback($method->getName(), Events::postLoad);
0 ignored issues
show
Bug introduced by
Consider using $method->name. There is an issue with getName() and APC-enabled PHP versions.
Loading history...
254 11
                } elseif ($annot instanceof ODM\PreFlush) {
255 650
                    $class->addLifecycleCallback($method->getName(), Events::preFlush);
0 ignored issues
show
Bug introduced by
Consider using $method->name. There is an issue with getName() and APC-enabled PHP versions.
Loading history...
256
                }
257
            }
258
        }
259 931
    }
260
261 225
    private function addIndex(ClassMetadataInfo $class, $index, array $keys = array())
262
    {
263 225
        $keys = array_merge($keys, $index->keys);
264 225
        $options = array();
265 225
        $allowed = array('name', 'dropDups', 'background', 'safe', 'unique', 'sparse', 'expireAfterSeconds');
266 225
        foreach ($allowed as $name) {
267 225
            if (isset($index->$name)) {
268 225
                $options[$name] = $index->$name;
269
            }
270
        }
271 225
        if (! empty($index->partialFilterExpression)) {
272 3
            $options['partialFilterExpression'] = $index->partialFilterExpression;
273
        }
274 225
        $options = array_merge($options, $index->options);
275 225
        $class->addIndex($keys, $options);
276 225
    }
277
278
    /**
279
     * @param ClassMetadataInfo $class
280
     * @param ODM\ShardKey      $shardKey
281
     *
282
     * @throws MappingException
283
     */
284 72
    private function setShardKey(ClassMetadataInfo $class, ODM\ShardKey $shardKey)
285
    {
286 72
        $options = array();
287 72
        $allowed = array('unique', 'numInitialChunks');
288 72
        foreach ($allowed as $name) {
289 72
            if (isset($shardKey->$name)) {
290 72
                $options[$name] = $shardKey->$name;
291
            }
292
        }
293
294 72
        $class->setShardKey($shardKey->keys, $options);
295 71
    }
296
297
    /**
298
     * Factory method for the Annotation Driver
299
     *
300
     * @param array|string $paths
301
     * @param Reader $reader
302
     * @return AnnotationDriver
303
     */
304 1177
    public static function create($paths = array(), Reader $reader = null)
305
    {
306 1177
        if ($reader === null) {
307 1177
            $reader = new AnnotationReader();
308
        }
309 1177
        return new self($reader, $paths);
0 ignored issues
show
Compatibility introduced by
$reader of type object<Doctrine\Common\Annotations\Reader> is not a sub-type of object<Doctrine\Common\A...tions\AnnotationReader>. It seems like you assume a concrete implementation of the interface Doctrine\Common\Annotations\Reader to be always present.

This check looks for parameters that are defined as one type in their type hint or doc comment but seem to be used as a narrower type, i.e an implementation of an interface or a subclass.

Consider changing the type of the parameter or doing an instanceof check before assuming your parameter is of the expected type.

Loading history...
310
    }
311
}
312