Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit b07393e

Browse files
Cleanup after AssociationBuilders and prep for ClassMetadataBuilder
1 parent 1488955 commit b07393e

19 files changed

Lines changed: 201 additions & 282 deletions
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Doctrine\ORM\Mapping\Builder;
6+
7+
use Doctrine\ORM\Annotation;
8+
use Doctrine\ORM\Mapping;
9+
use function assert;
10+
11+
class ClassMetadataBuilder
12+
{
13+
/** @var Mapping\ClassMetadataBuildingContext */
14+
private $metadataBuildingContext;
15+
16+
/** @var CacheMetadataBuilder */
17+
protected $cacheMetadataBuilder;
18+
19+
/** @var string */
20+
private $className;
21+
22+
/** @var Mapping\ComponentMetadata */
23+
private $parentMetadata;
24+
25+
/** @var Annotation\Cache|null */
26+
protected $cacheAnnotation;
27+
28+
public function __construct(
29+
Mapping\ClassMetadataBuildingContext $metadataBuildingContext,
30+
?CacheMetadataBuilder $cacheMetadataBuilder = null
31+
) {
32+
$this->metadataBuildingContext = $metadataBuildingContext;
33+
$this->cacheMetadataBuilder = $cacheMetadataBuilder ?: new CacheMetadataBuilder($metadataBuildingContext);
34+
}
35+
36+
public function getClassName(string $className) : ClassMetadataBuilder
37+
{
38+
$this->className = $className;
39+
40+
return $this;
41+
}
42+
43+
public function withParentMetadata(Mapping\ComponentMetadata $parentMetadata) : ClassMetadataBuilder
44+
{
45+
$this->parentMetadata = $parentMetadata;
46+
47+
return $this;
48+
}
49+
50+
public function withCacheAnnotation(?Annotation\Cache $cacheAnnotation) : ClassMetadataBuilder
51+
{
52+
$this->cacheAnnotation = $cacheAnnotation;
53+
54+
if ($cacheAnnotation !== null) {
55+
$this->cacheMetadataBuilder->withCacheAnnotation($cacheAnnotation);
56+
}
57+
58+
return $this;
59+
}
60+
61+
public function build() : Mapping\ClassMetadata
62+
{
63+
assert($this->className !== null);
64+
65+
$reflectionService = $this->metadataBuildingContext->getReflectionService();
66+
$reflectionClass = $reflectionService->getClass($this->className);
67+
$className = $reflectionClass ? $reflectionClass->getName() : $this->className;
68+
69+
$classMetadata = new Mapping\ClassMetadata($className, $this->parentMetadata);
70+
71+
$this->buildCache($classMetadata);
72+
73+
return $classMetadata;
74+
}
75+
76+
protected function buildCache(Mapping\ClassMetadata $classMetadata) : void
77+
{
78+
if ($this->cacheAnnotation !== null) {
79+
$classMetadata->setCache($this->cacheMetadataBuilder->build());
80+
}
81+
}
82+
}

lib/Doctrine/ORM/Mapping/ClassMetadata.php

Lines changed: 3 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -179,12 +179,9 @@ class ClassMetadata extends ComponentMetadata implements TableOwner
179179
* @param string $entityName The name of the entity class.
180180
* @param ClassMetadata|null $parent Optional parent class metadata.
181181
*/
182-
public function __construct(
183-
string $entityName,
184-
?ComponentMetadata $parent,
185-
ClassMetadataBuildingContext $metadataBuildingContext
186-
) {
187-
parent::__construct($entityName, $metadataBuildingContext);
182+
public function __construct(string $entityName, ?ComponentMetadata $parent)
183+
{
184+
parent::__construct($entityName);
188185

189186
if ($parent) {
190187
$this->setParent($parent);
@@ -373,26 +370,6 @@ public function __sleep()
373370
return $serialized;
374371
}
375372

376-
/**
377-
* Restores some state that can not be serialized/unserialized.
378-
*/
379-
public function wakeupReflection(ReflectionService $reflectionService) : void
380-
{
381-
// Restore ReflectionClass and properties
382-
$this->reflectionClass = $reflectionService->getClass($this->className);
383-
384-
if (! $this->reflectionClass) {
385-
return;
386-
}
387-
388-
$this->className = $this->reflectionClass->getName();
389-
390-
foreach ($this->properties as $property) {
391-
/** @var Property $property */
392-
$property->wakeupReflection($reflectionService);
393-
}
394-
}
395-
396373
/**
397374
* Sets the change tracking policy used by this class.
398375
*/

lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,10 @@ protected function doLoadMetadata(
390390
?ClassMetadata $parent,
391391
ClassMetadataBuildingContext $metadataBuildingContext
392392
) : ?ComponentMetadata {
393+
$reflectionService = $metadataBuildingContext->getReflectionService();
394+
$reflectionClass = $reflectionService->getClass($className);
395+
$className = $reflectionClass ? $reflectionClass->getName() : $className;
396+
393397
/** @var ClassMetadata $classMetadata */
394398
$classMetadata = $this->driver->loadMetadataForClass($className, $parent, $metadataBuildingContext);
395399

@@ -399,6 +403,8 @@ protected function doLoadMetadata(
399403
$this->evm->dispatchEvent(Events::loadClassMetadata, $eventArgs);
400404
}
401405

406+
$classMetadata->wakeupReflection($metadataBuildingContext->getReflectionService());
407+
402408
$this->buildValueGenerationPlan($classMetadata);
403409
$this->validateRuntimeMetadata($classMetadata, $parent);
404410

lib/Doctrine/ORM/Mapping/ComponentMetadata.php

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
namespace Doctrine\ORM\Mapping;
66

77
use ArrayIterator;
8+
use Doctrine\ORM\Reflection\ReflectionService;
89
use ReflectionClass;
910
use ReflectionException;
10-
use ReflectionProperty;
1111

1212
/**
1313
* A <tt>ComponentMetadata</tt> instance holds object-relational property mapping.
@@ -33,12 +33,9 @@ abstract class ComponentMetadata
3333
/** @var Property[] */
3434
protected $properties = [];
3535

36-
public function __construct(string $className, ClassMetadataBuildingContext $metadataBuildingContext)
36+
public function __construct(string $className)
3737
{
38-
$reflectionService = $metadataBuildingContext->getReflectionService();
39-
40-
$this->reflectionClass = $reflectionService->getClass($className);
41-
$this->className = $this->reflectionClass ? $this->reflectionClass->getName() : $className;
38+
$this->className = $className;
4239
}
4340

4441
public function getClassName() : string
@@ -56,6 +53,23 @@ public function getParent() : ?ComponentMetadata
5653
return $this->parent;
5754
}
5855

56+
public function wakeupReflection(ReflectionService $reflectionService) : void
57+
{
58+
// Restore ReflectionClass and properties
59+
$this->reflectionClass = $reflectionService->getClass($this->className);
60+
61+
if (! $this->reflectionClass) {
62+
return;
63+
}
64+
65+
$this->className = $this->reflectionClass->getName();
66+
67+
foreach ($this->properties as $property) {
68+
/** @var Property $property */
69+
$property->wakeupReflection($reflectionService);
70+
}
71+
}
72+
5973
public function getReflectionClass() : ?ReflectionClass
6074
{
6175
return $this->reflectionClass;
@@ -96,14 +110,6 @@ public function addProperty(Property $property) : void
96110

97111
$property->setDeclaringClass($this);
98112

99-
if ($this->reflectionClass) {
100-
$reflectionProperty = new ReflectionProperty($className, $propertyName);
101-
102-
$reflectionProperty->setAccessible(true);
103-
104-
$property->setReflectionProperty($reflectionProperty);
105-
}
106-
107113
$this->properties[$propertyName] = $property;
108114
}
109115

lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php

Lines changed: 1 addition & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,10 @@
2222
use RegexIterator;
2323
use RuntimeException;
2424
use UnexpectedValueException;
25-
use function array_diff;
26-
use function array_intersect;
27-
use function array_map;
2825
use function array_merge;
2926
use function array_unique;
3027
use function class_exists;
3128
use function constant;
32-
use function count;
33-
use function defined;
3429
use function get_class;
3530
use function get_declared_classes;
3631
use function in_array;
@@ -284,7 +279,7 @@ public function loadMetadataForClass(
284279
Mapping\ClassMetadataBuildingContext $metadataBuildingContext
285280
) : Mapping\ComponentMetadata {
286281
$reflectionClass = new ReflectionClass($className);
287-
$metadata = new Mapping\ClassMetadata($className, $parent, $metadataBuildingContext);
282+
$metadata = new Mapping\ClassMetadata($className, $parent);
288283
$classAnnotations = $this->getClassAnnotations($reflectionClass);
289284
$classMetadata = $this->convertClassAnnotationsToClassMetadata(
290285
$classAnnotations,
@@ -840,56 +835,6 @@ private function attachPropertyOverrides(
840835
}
841836
}
842837

843-
/**
844-
* Attempts to resolve the cascade modes.
845-
*
846-
* @param string $className The class name.
847-
* @param string $fieldName The field name.
848-
* @param string[] $originalCascades The original unprocessed field cascades.
849-
*
850-
* @return string[] The processed field cascades.
851-
*
852-
* @throws Mapping\MappingException If a cascade option is not valid.
853-
*/
854-
private function getCascade(string $className, string $fieldName, array $originalCascades) : array
855-
{
856-
$cascadeTypes = ['remove', 'persist', 'refresh'];
857-
$cascades = array_map('strtolower', $originalCascades);
858-
859-
if (in_array('all', $cascades, true)) {
860-
$cascades = $cascadeTypes;
861-
}
862-
863-
if (count($cascades) !== count(array_intersect($cascades, $cascadeTypes))) {
864-
$diffCascades = array_diff($cascades, array_intersect($cascades, $cascadeTypes));
865-
866-
throw Mapping\MappingException::invalidCascadeOption($diffCascades, $className, $fieldName);
867-
}
868-
869-
return $cascades;
870-
}
871-
872-
/**
873-
* Attempts to resolve the fetch mode.
874-
*
875-
* @param string $className The class name.
876-
* @param string $fetchMode The fetch mode.
877-
*
878-
* @return string The fetch mode as defined in ClassMetadata.
879-
*
880-
* @throws Mapping\MappingException If the fetch mode is not valid.
881-
*/
882-
private function getFetchMode($className, $fetchMode) : string
883-
{
884-
$fetchModeConstant = sprintf('%s::%s', Mapping\FetchMode::class, $fetchMode);
885-
886-
if (! defined($fetchModeConstant)) {
887-
throw Mapping\MappingException::invalidFetchMode($className, $fetchMode);
888-
}
889-
890-
return constant($fetchModeConstant);
891-
}
892-
893838
/**
894839
* @return Annotation\Annotation[]
895840
*/

lib/Doctrine/ORM/Mapping/Driver/DatabaseDriver.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ public function loadMetadataForClass(
149149
throw new InvalidArgumentException('Unknown class ' . $className);
150150
}
151151

152-
$metadata = new Mapping\ClassMetadata($className, $parent, $metadataBuildingContext);
152+
$metadata = new Mapping\ClassMetadata($className, $parent);
153153

154154
$this->buildTable($metadata);
155155
$this->buildFieldMappings($metadata);

lib/Doctrine/ORM/Mapping/Driver/NewAnnotationDriver.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ private function convertClassAnnotationsToEntityClassMetadata(
230230
) {
231231
/** @var Annotation\Entity $entityAnnot */
232232
$entityAnnot = $classAnnotations[Annotation\Entity::class];
233-
$classMetadata = new Mapping\ClassMetadata($reflectionClass->getName(), $parent, $metadataBuildingContext);
233+
$classMetadata = new Mapping\ClassMetadata($reflectionClass->getName(), $parent);
234234

235235
if ($entityAnnot->repositoryClass !== null) {
236236
$classMetadata->setCustomRepositoryClassName($entityAnnot->repositoryClass);
@@ -387,7 +387,7 @@ private function convertClassAnnotationsToMappedSuperClassMetadata(
387387
) {
388388
/** @var Annotation\MappedSuperclass $mappedSuperclassAnnot */
389389
$mappedSuperclassAnnot = $classAnnotations[Annotation\MappedSuperclass::class];
390-
$classMetadata = new Mapping\MappedSuperClassMetadata($reflectionClass->getName(), $parent);
390+
$classMetadata = new Mapping\MappedSuperClassMetadata($reflectionClass->getName());
391391

392392
if ($mappedSuperclassAnnot->repositoryClass !== null) {
393393
$classMetadata->setCustomRepositoryClassName($mappedSuperclassAnnot->repositoryClass);

lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public function loadMetadataForClass(
4747
?Mapping\ComponentMetadata $parent,
4848
Mapping\ClassMetadataBuildingContext $metadataBuildingContext
4949
) : Mapping\ComponentMetadata {
50-
$metadata = new Mapping\ClassMetadata($className, $parent, $metadataBuildingContext);
50+
$metadata = new Mapping\ClassMetadata($className, $parent);
5151

5252
/** @var SimpleXMLElement $xmlRoot */
5353
$xmlRoot = $this->getElement($className);

lib/Doctrine/ORM/Mapping/EmbeddedClassMetadata.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ class EmbeddedClassMetadata extends ComponentMetadata implements Property
2626
/** @var bool */
2727
protected $primaryKey = false;
2828

29-
public function __construct(string $name, string $className, ?MappedSuperClassMetadata $parent = null)
29+
public function __construct(string $name, string $className/*, ?MappedSuperClassMetadata $parent = null*/)
3030
{
31-
parent::__construct($className, $parent);
31+
parent::__construct($className);
3232

3333
$this->name = $name;
3434
}

lib/Doctrine/ORM/Mapping/EntityClassMetadata.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,9 @@ abstract class EntityClassMetadata extends ComponentMetadata
6767
*/
6868
protected $table;
6969

70-
public function __construct(string $className, ClassMetadataBuildingContext $metadataBuildingContext)
70+
public function __construct(string $className)
7171
{
72-
parent::__construct($className, $metadataBuildingContext);
72+
parent::__construct($className);
7373

7474
$this->entityName = $className;
7575
}

0 commit comments

Comments
 (0)