Skip to content

Commit

Permalink
Cleanup after AssociationBuilders and prep for ClassMetadataBuilder
Browse files Browse the repository at this point in the history
  • Loading branch information
guilhermeblanco committed Aug 19, 2019
1 parent 1488955 commit b07393e
Show file tree
Hide file tree
Showing 19 changed files with 201 additions and 282 deletions.
82 changes: 82 additions & 0 deletions lib/Doctrine/ORM/Mapping/Builder/ClassMetadataBuilder.php
@@ -0,0 +1,82 @@
<?php

declare(strict_types=1);

namespace Doctrine\ORM\Mapping\Builder;

use Doctrine\ORM\Annotation;
use Doctrine\ORM\Mapping;
use function assert;

class ClassMetadataBuilder
{
/** @var Mapping\ClassMetadataBuildingContext */
private $metadataBuildingContext;

/** @var CacheMetadataBuilder */
protected $cacheMetadataBuilder;

/** @var string */
private $className;

/** @var Mapping\ComponentMetadata */
private $parentMetadata;

/** @var Annotation\Cache|null */
protected $cacheAnnotation;

public function __construct(
Mapping\ClassMetadataBuildingContext $metadataBuildingContext,
?CacheMetadataBuilder $cacheMetadataBuilder = null
) {
$this->metadataBuildingContext = $metadataBuildingContext;
$this->cacheMetadataBuilder = $cacheMetadataBuilder ?: new CacheMetadataBuilder($metadataBuildingContext);
}

public function getClassName(string $className) : ClassMetadataBuilder
{
$this->className = $className;

return $this;
}

public function withParentMetadata(Mapping\ComponentMetadata $parentMetadata) : ClassMetadataBuilder
{
$this->parentMetadata = $parentMetadata;

return $this;
}

public function withCacheAnnotation(?Annotation\Cache $cacheAnnotation) : ClassMetadataBuilder
{
$this->cacheAnnotation = $cacheAnnotation;

if ($cacheAnnotation !== null) {
$this->cacheMetadataBuilder->withCacheAnnotation($cacheAnnotation);
}

return $this;
}

public function build() : Mapping\ClassMetadata
{
assert($this->className !== null);

$reflectionService = $this->metadataBuildingContext->getReflectionService();
$reflectionClass = $reflectionService->getClass($this->className);
$className = $reflectionClass ? $reflectionClass->getName() : $this->className;

$classMetadata = new Mapping\ClassMetadata($className, $this->parentMetadata);

$this->buildCache($classMetadata);

return $classMetadata;
}

protected function buildCache(Mapping\ClassMetadata $classMetadata) : void
{
if ($this->cacheAnnotation !== null) {
$classMetadata->setCache($this->cacheMetadataBuilder->build());
}
}
}
29 changes: 3 additions & 26 deletions lib/Doctrine/ORM/Mapping/ClassMetadata.php
Expand Up @@ -179,12 +179,9 @@ class ClassMetadata extends ComponentMetadata implements TableOwner
* @param string $entityName The name of the entity class.
* @param ClassMetadata|null $parent Optional parent class metadata.
*/
public function __construct(
string $entityName,
?ComponentMetadata $parent,
ClassMetadataBuildingContext $metadataBuildingContext
) {
parent::__construct($entityName, $metadataBuildingContext);
public function __construct(string $entityName, ?ComponentMetadata $parent)
{
parent::__construct($entityName);

if ($parent) {
$this->setParent($parent);
Expand Down Expand Up @@ -373,26 +370,6 @@ public function __sleep()
return $serialized;
}

/**
* Restores some state that can not be serialized/unserialized.
*/
public function wakeupReflection(ReflectionService $reflectionService) : void
{
// Restore ReflectionClass and properties
$this->reflectionClass = $reflectionService->getClass($this->className);

if (! $this->reflectionClass) {
return;
}

$this->className = $this->reflectionClass->getName();

foreach ($this->properties as $property) {
/** @var Property $property */
$property->wakeupReflection($reflectionService);
}
}

/**
* Sets the change tracking policy used by this class.
*/
Expand Down
6 changes: 6 additions & 0 deletions lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php
Expand Up @@ -390,6 +390,10 @@ protected function doLoadMetadata(
?ClassMetadata $parent,
ClassMetadataBuildingContext $metadataBuildingContext
) : ?ComponentMetadata {
$reflectionService = $metadataBuildingContext->getReflectionService();
$reflectionClass = $reflectionService->getClass($className);
$className = $reflectionClass ? $reflectionClass->getName() : $className;

/** @var ClassMetadata $classMetadata */
$classMetadata = $this->driver->loadMetadataForClass($className, $parent, $metadataBuildingContext);

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

$classMetadata->wakeupReflection($metadataBuildingContext->getReflectionService());

$this->buildValueGenerationPlan($classMetadata);
$this->validateRuntimeMetadata($classMetadata, $parent);

Expand Down
34 changes: 20 additions & 14 deletions lib/Doctrine/ORM/Mapping/ComponentMetadata.php
Expand Up @@ -5,9 +5,9 @@
namespace Doctrine\ORM\Mapping;

use ArrayIterator;
use Doctrine\ORM\Reflection\ReflectionService;
use ReflectionClass;
use ReflectionException;
use ReflectionProperty;

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

public function __construct(string $className, ClassMetadataBuildingContext $metadataBuildingContext)
public function __construct(string $className)
{
$reflectionService = $metadataBuildingContext->getReflectionService();

$this->reflectionClass = $reflectionService->getClass($className);
$this->className = $this->reflectionClass ? $this->reflectionClass->getName() : $className;
$this->className = $className;
}

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

public function wakeupReflection(ReflectionService $reflectionService) : void
{
// Restore ReflectionClass and properties
$this->reflectionClass = $reflectionService->getClass($this->className);

if (! $this->reflectionClass) {
return;
}

$this->className = $this->reflectionClass->getName();

foreach ($this->properties as $property) {
/** @var Property $property */
$property->wakeupReflection($reflectionService);
}
}

public function getReflectionClass() : ?ReflectionClass
{
return $this->reflectionClass;
Expand Down Expand Up @@ -96,14 +110,6 @@ public function addProperty(Property $property) : void

$property->setDeclaringClass($this);

if ($this->reflectionClass) {
$reflectionProperty = new ReflectionProperty($className, $propertyName);

$reflectionProperty->setAccessible(true);

$property->setReflectionProperty($reflectionProperty);
}

$this->properties[$propertyName] = $property;
}

Expand Down
57 changes: 1 addition & 56 deletions lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php
Expand Up @@ -22,15 +22,10 @@
use RegexIterator;
use RuntimeException;
use UnexpectedValueException;
use function array_diff;
use function array_intersect;
use function array_map;
use function array_merge;
use function array_unique;
use function class_exists;
use function constant;
use function count;
use function defined;
use function get_class;
use function get_declared_classes;
use function in_array;
Expand Down Expand Up @@ -284,7 +279,7 @@ public function loadMetadataForClass(
Mapping\ClassMetadataBuildingContext $metadataBuildingContext
) : Mapping\ComponentMetadata {
$reflectionClass = new ReflectionClass($className);
$metadata = new Mapping\ClassMetadata($className, $parent, $metadataBuildingContext);
$metadata = new Mapping\ClassMetadata($className, $parent);
$classAnnotations = $this->getClassAnnotations($reflectionClass);
$classMetadata = $this->convertClassAnnotationsToClassMetadata(
$classAnnotations,
Expand Down Expand Up @@ -840,56 +835,6 @@ private function attachPropertyOverrides(
}
}

/**
* Attempts to resolve the cascade modes.
*
* @param string $className The class name.
* @param string $fieldName The field name.
* @param string[] $originalCascades The original unprocessed field cascades.
*
* @return string[] The processed field cascades.
*
* @throws Mapping\MappingException If a cascade option is not valid.
*/
private function getCascade(string $className, string $fieldName, array $originalCascades) : array
{
$cascadeTypes = ['remove', 'persist', 'refresh'];
$cascades = array_map('strtolower', $originalCascades);

if (in_array('all', $cascades, true)) {
$cascades = $cascadeTypes;
}

if (count($cascades) !== count(array_intersect($cascades, $cascadeTypes))) {
$diffCascades = array_diff($cascades, array_intersect($cascades, $cascadeTypes));

throw Mapping\MappingException::invalidCascadeOption($diffCascades, $className, $fieldName);
}

return $cascades;
}

/**
* Attempts to resolve the fetch mode.
*
* @param string $className The class name.
* @param string $fetchMode The fetch mode.
*
* @return string The fetch mode as defined in ClassMetadata.
*
* @throws Mapping\MappingException If the fetch mode is not valid.
*/
private function getFetchMode($className, $fetchMode) : string
{
$fetchModeConstant = sprintf('%s::%s', Mapping\FetchMode::class, $fetchMode);

if (! defined($fetchModeConstant)) {
throw Mapping\MappingException::invalidFetchMode($className, $fetchMode);
}

return constant($fetchModeConstant);
}

/**
* @return Annotation\Annotation[]
*/
Expand Down
2 changes: 1 addition & 1 deletion lib/Doctrine/ORM/Mapping/Driver/DatabaseDriver.php
Expand Up @@ -149,7 +149,7 @@ public function loadMetadataForClass(
throw new InvalidArgumentException('Unknown class ' . $className);
}

$metadata = new Mapping\ClassMetadata($className, $parent, $metadataBuildingContext);
$metadata = new Mapping\ClassMetadata($className, $parent);

$this->buildTable($metadata);
$this->buildFieldMappings($metadata);
Expand Down
4 changes: 2 additions & 2 deletions lib/Doctrine/ORM/Mapping/Driver/NewAnnotationDriver.php
Expand Up @@ -230,7 +230,7 @@ private function convertClassAnnotationsToEntityClassMetadata(
) {
/** @var Annotation\Entity $entityAnnot */
$entityAnnot = $classAnnotations[Annotation\Entity::class];
$classMetadata = new Mapping\ClassMetadata($reflectionClass->getName(), $parent, $metadataBuildingContext);
$classMetadata = new Mapping\ClassMetadata($reflectionClass->getName(), $parent);

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

if ($mappedSuperclassAnnot->repositoryClass !== null) {
$classMetadata->setCustomRepositoryClassName($mappedSuperclassAnnot->repositoryClass);
Expand Down
2 changes: 1 addition & 1 deletion lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php
Expand Up @@ -47,7 +47,7 @@ public function loadMetadataForClass(
?Mapping\ComponentMetadata $parent,
Mapping\ClassMetadataBuildingContext $metadataBuildingContext
) : Mapping\ComponentMetadata {
$metadata = new Mapping\ClassMetadata($className, $parent, $metadataBuildingContext);
$metadata = new Mapping\ClassMetadata($className, $parent);

/** @var SimpleXMLElement $xmlRoot */
$xmlRoot = $this->getElement($className);
Expand Down
4 changes: 2 additions & 2 deletions lib/Doctrine/ORM/Mapping/EmbeddedClassMetadata.php
Expand Up @@ -26,9 +26,9 @@ class EmbeddedClassMetadata extends ComponentMetadata implements Property
/** @var bool */
protected $primaryKey = false;

public function __construct(string $name, string $className, ?MappedSuperClassMetadata $parent = null)
public function __construct(string $name, string $className/*, ?MappedSuperClassMetadata $parent = null*/)
{
parent::__construct($className, $parent);
parent::__construct($className);

$this->name = $name;
}
Expand Down
4 changes: 2 additions & 2 deletions lib/Doctrine/ORM/Mapping/EntityClassMetadata.php
Expand Up @@ -67,9 +67,9 @@ abstract class EntityClassMetadata extends ComponentMetadata
*/
protected $table;

public function __construct(string $className, ClassMetadataBuildingContext $metadataBuildingContext)
public function __construct(string $className)
{
parent::__construct($className, $metadataBuildingContext);
parent::__construct($className);

$this->entityName = $className;
}
Expand Down

0 comments on commit b07393e

Please sign in to comment.