diff --git a/lib/Doctrine/ORM/Mapping/ClassMetadata.php b/lib/Doctrine/ORM/Mapping/ClassMetadata.php index a5b983fbb..70b8f9e40 100644 --- a/lib/Doctrine/ORM/Mapping/ClassMetadata.php +++ b/lib/Doctrine/ORM/Mapping/ClassMetadata.php @@ -20,7 +20,6 @@ namespace Doctrine\ORM\Mapping; use ReflectionClass, ReflectionProperty; -use Doctrine\Common\Persistence\Mapping\ClassMetadata AS IClassMetadata; /** * A ClassMetadata instance holds all the object-relational mapping metadata @@ -40,344 +39,6 @@ use Doctrine\Common\Persistence\Mapping\ClassMetadata AS IClassMetadata; * @author Jonathan H. Wage * @since 2.0 */ -class ClassMetadata extends ClassMetadataInfo implements IClassMetadata +class ClassMetadata extends ClassMetadataInfo { - /** - * The ReflectionProperty instances of the mapped class. - * - * @var array - */ - public $reflFields = array(); - - /** - * The prototype from which new instances of the mapped class are created. - * - * @var object - */ - private $_prototype; - - /** - * Initializes a new ClassMetadata instance that will hold the object-relational mapping - * metadata of the class with the given name. - * - * @param string $entityName The name of the entity class the new instance is used for. - */ - public function __construct($entityName) - { - $this->reflClass = new ReflectionClass($entityName); - $this->namespace = $this->reflClass->getNamespaceName(); - $this->table['name'] = $this->reflClass->getShortName(); - parent::__construct($this->reflClass->getName()); // do not use $entityName, possible case-problems - } - - /** - * Gets the ReflectionPropertys of the mapped class. - * - * @return array An array of ReflectionProperty instances. - */ - public function getReflectionProperties() - { - return $this->reflFields; - } - - /** - * Gets a ReflectionProperty for a specific field of the mapped class. - * - * @param string $name - * @return ReflectionProperty - */ - public function getReflectionProperty($name) - { - return $this->reflFields[$name]; - } - - /** - * Gets the ReflectionProperty for the single identifier field. - * - * @return ReflectionProperty - * @throws BadMethodCallException If the class has a composite identifier. - */ - public function getSingleIdReflectionProperty() - { - if ($this->isIdentifierComposite) { - throw new \BadMethodCallException("Class " . $this->name . " has a composite identifier."); - } - return $this->reflFields[$this->identifier[0]]; - } - - /** - * Validates & completes the given field mapping. - * - * @param array $mapping The field mapping to validated & complete. - * @return array The validated and completed field mapping. - * - * @throws MappingException - */ - protected function _validateAndCompleteFieldMapping(array &$mapping) - { - parent::_validateAndCompleteFieldMapping($mapping); - - // Store ReflectionProperty of mapped field - $refProp = $this->reflClass->getProperty($mapping['fieldName']); - $refProp->setAccessible(true); - $this->reflFields[$mapping['fieldName']] = $refProp; - } - - /** - * Validates & completes the basic mapping information that is common to all - * association mappings (one-to-one, many-ot-one, one-to-many, many-to-many). - * - * @param array $mapping The mapping. - * @return array The updated mapping. - * @throws MappingException If something is wrong with the mapping. - */ - protected function _validateAndCompleteAssociationMapping(array $mapping) - { - $mapping = parent::_validateAndCompleteAssociationMapping($mapping); - - if ( ! \Doctrine\Common\ClassLoader::classExists($mapping['targetEntity']) ) { - throw MappingException::invalidTargetEntityClass($mapping['targetEntity'], $this->name, $mapping['fieldName']); - } - - return $mapping; - } - - /** - * Extracts the identifier values of an entity of this class. - * - * For composite identifiers, the identifier values are returned as an array - * with the same order as the field order in {@link identifier}. - * - * @param object $entity - * @return array - */ - public function getIdentifierValues($entity) - { - if ($this->isIdentifierComposite) { - $id = array(); - - foreach ($this->identifier as $idField) { - $value = $this->reflFields[$idField]->getValue($entity); - - if ($value !== null) { - $id[$idField] = $value; - } - } - - return $id; - } - - $value = $this->reflFields[$this->identifier[0]]->getValue($entity); - - if ($value !== null) { - return array($this->identifier[0] => $value); - } - - return array(); - } - - /** - * Populates the entity identifier of an entity. - * - * @param object $entity - * @param mixed $id - * @todo Rename to assignIdentifier() - */ - public function setIdentifierValues($entity, array $id) - { - foreach ($id as $idField => $idValue) { - $this->reflFields[$idField]->setValue($entity, $idValue); - } - } - - /** - * Sets the specified field to the specified value on the given entity. - * - * @param object $entity - * @param string $field - * @param mixed $value - */ - public function setFieldValue($entity, $field, $value) - { - $this->reflFields[$field]->setValue($entity, $value); - } - - /** - * Gets the specified field's value off the given entity. - * - * @param object $entity - * @param string $field - */ - public function getFieldValue($entity, $field) - { - return $this->reflFields[$field]->getValue($entity); - } - - /** - * Stores the association mapping. - * - * @param AssociationMapping $assocMapping - */ - protected function _storeAssociationMapping(array $assocMapping) - { - parent::_storeAssociationMapping($assocMapping); - - // Store ReflectionProperty of mapped field - $sourceFieldName = $assocMapping['fieldName']; - - $refProp = $this->reflClass->getProperty($sourceFieldName); - $refProp->setAccessible(true); - $this->reflFields[$sourceFieldName] = $refProp; - } - - /** - * Creates a string representation of this instance. - * - * @return string The string representation of this instance. - * @todo Construct meaningful string representation. - */ - public function __toString() - { - return __CLASS__ . '@' . spl_object_hash($this); - } - - /** - * Determines which fields get serialized. - * - * It is only serialized what is necessary for best unserialization performance. - * That means any metadata properties that are not set or empty or simply have - * their default value are NOT serialized. - * - * Parts that are also NOT serialized because they can not be properly unserialized: - * - reflClass (ReflectionClass) - * - reflFields (ReflectionProperty array) - * - * @return array The names of all the fields that should be serialized. - */ - public function __sleep() - { - // This metadata is always serialized/cached. - $serialized = array( - 'associationMappings', - 'columnNames', //TODO: Not really needed. Can use fieldMappings[$fieldName]['columnName'] - 'fieldMappings', - 'fieldNames', - 'identifier', - 'isIdentifierComposite', // TODO: REMOVE - 'name', - 'namespace', // TODO: REMOVE - 'table', - 'rootEntityName', - 'idGenerator', //TODO: Does not really need to be serialized. Could be moved to runtime. - ); - - // The rest of the metadata is only serialized if necessary. - if ($this->changeTrackingPolicy != self::CHANGETRACKING_DEFERRED_IMPLICIT) { - $serialized[] = 'changeTrackingPolicy'; - } - - if ($this->customRepositoryClassName) { - $serialized[] = 'customRepositoryClassName'; - } - - if ($this->inheritanceType != self::INHERITANCE_TYPE_NONE) { - $serialized[] = 'inheritanceType'; - $serialized[] = 'discriminatorColumn'; - $serialized[] = 'discriminatorValue'; - $serialized[] = 'discriminatorMap'; - $serialized[] = 'parentClasses'; - $serialized[] = 'subClasses'; - } - - if ($this->generatorType != self::GENERATOR_TYPE_NONE) { - $serialized[] = 'generatorType'; - if ($this->generatorType == self::GENERATOR_TYPE_SEQUENCE) { - $serialized[] = 'sequenceGeneratorDefinition'; - } - } - - if ($this->isMappedSuperclass) { - $serialized[] = 'isMappedSuperclass'; - } - - if ($this->containsForeignIdentifier) { - $serialized[] = 'containsForeignIdentifier'; - } - - if ($this->isVersioned) { - $serialized[] = 'isVersioned'; - $serialized[] = 'versionField'; - } - - if ($this->lifecycleCallbacks) { - $serialized[] = 'lifecycleCallbacks'; - } - - if ($this->namedQueries) { - $serialized[] = 'namedQueries'; - } - - if ($this->isReadOnly) { - $serialized[] = 'isReadOnly'; - } - - return $serialized; - } - - /** - * Restores some state that can not be serialized/unserialized. - * - * @return void - */ - public function __wakeup() - { - // Restore ReflectionClass and properties - $this->reflClass = new ReflectionClass($this->name); - - foreach ($this->fieldMappings as $field => $mapping) { - $reflField = isset($mapping['declared']) - ? new ReflectionProperty($mapping['declared'], $field) - : $this->reflClass->getProperty($field); - - $reflField->setAccessible(true); - $this->reflFields[$field] = $reflField; - } - - foreach ($this->associationMappings as $field => $mapping) { - $reflField = isset($mapping['declared']) - ? new ReflectionProperty($mapping['declared'], $field) - : $this->reflClass->getProperty($field); - - $reflField->setAccessible(true); - $this->reflFields[$field] = $reflField; - } - } - - /** - * Creates a new instance of the mapped class, without invoking the constructor. - * - * @return object - */ - public function newInstance() - { - if ($this->_prototype === null) { - $this->_prototype = unserialize(sprintf('O:%d:"%s":0:{}', strlen($this->name), $this->name)); - } - - return clone $this->_prototype; - } - - /** - * @param string $callback - * @param string $event - */ - public function addLifecycleCallback($callback, $event) - { - if ( !$this->reflClass->hasMethod($callback) || - ($this->reflClass->getMethod($callback)->getModifiers() & \ReflectionMethod::IS_PUBLIC) == 0) { - throw MappingException::lifecycleCallbackMethodNotFound($this->name, $callback); - } - - return parent::addLifecycleCallback($callback, $event); - } } diff --git a/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php b/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php index bf802ecf9..c371e47a6 100644 --- a/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php +++ b/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php @@ -24,6 +24,8 @@ use ReflectionException, Doctrine\ORM\EntityManager, Doctrine\DBAL\Platforms, Doctrine\ORM\Events, + Doctrine\Common\Persistence\Mapping\RuntimeReflectionService, + Doctrine\Common\Persistence\Mapping\ReflectionService, Doctrine\Common\Persistence\Mapping\ClassMetadataFactory as ClassMetadataFactoryInterface; /** @@ -74,6 +76,11 @@ class ClassMetadataFactory implements ClassMetadataFactoryInterface */ private $initialized = false; + /** + * @var ReflectionService + */ + private $reflectionService; + /** * @param EntityManager $$em */ @@ -165,6 +172,7 @@ class ClassMetadataFactory implements ClassMetadataFactoryInterface if ($this->cacheDriver) { if (($cached = $this->cacheDriver->fetch("$realClassName\$CLASSMETADATA")) !== false) { + $this->wakeupReflection($cached, $this->getReflectionService()); $this->loadedMetadata[$realClassName] = $cached; } else { foreach ($this->loadMetadata($realClassName) as $loadedClassName) { @@ -220,7 +228,7 @@ class ClassMetadataFactory implements ClassMetadataFactoryInterface { // Collect parent classes, ignoring transient (not-mapped) classes. $parentClasses = array(); - foreach (array_reverse(class_parents($name)) as $parentClass) { + foreach (array_reverse($this->getReflectionService()->getParentClasses($name)) as $parentClass) { if ( ! $this->driver->isTransient($parentClass)) { $parentClasses[] = $parentClass; } @@ -261,6 +269,7 @@ class ClassMetadataFactory implements ClassMetadataFactoryInterface } $class = $this->newClassMetadataInstance($className); + $this->initializeReflection($class, $this->getReflectionService()); if ($parent) { $class->setInheritanceType($parent->inheritanceType); @@ -282,6 +291,7 @@ class ClassMetadataFactory implements ClassMetadataFactoryInterface // Invoke driver try { $this->driver->loadMetadataForClass($className, $class); + $this->wakeupReflection($class, $this->getReflectionService()); } catch (ReflectionException $e) { throw MappingException::reflectionFailure($className, $e); } @@ -349,11 +359,15 @@ class ClassMetadataFactory implements ClassMetadataFactoryInterface */ protected function validateRuntimeMetadata($class, $parent) { - // Verify & complete identifier mapping - if ( ! $class->identifier && ! $class->isMappedSuperclass) { - throw MappingException::identifierRequired($class->name); + if ( ! $class->reflClass ) { + // only validate if there is a reflection class instance + return; } + $class->validateIdentifier(); + $class->validateAssocations(); + $class->validateLifecycleCallbacks($this->getReflectionService()); + // verify inheritance if (!$class->isMappedSuperclass && !$class->isInheritanceTypeNone()) { if (!$parent) { @@ -371,10 +385,6 @@ class ClassMetadataFactory implements ClassMetadataFactoryInterface // second condition is necessary for mapped superclasses in the middle of an inheritance hierachy throw MappingException::noInheritanceOnMappedSuperClass($class->name); } - - if ($class->usesIdGenerator() && $class->isIdentifierComposite) { - throw MappingException::compositeKeyAssignedIdGeneratorRequired($class->name); - } } /** @@ -533,4 +543,51 @@ class ClassMetadataFactory implements ClassMetadataFactoryInterface return $this->driver->isTransient($class); } + + /** + * Get reflectionService. + * + * @return \Doctrine\Common\Persistence\Mapping\ReflectionService + */ + public function getReflectionService() + { + if ($this->reflectionService === null) { + $this->reflectionService = new RuntimeReflectionService(); + } + return $this->reflectionService; + } + + /** + * Set reflectionService. + * + * @param reflectionService the value to set. + */ + public function setReflectionService(ReflectionService $reflectionService) + { + $this->reflectionService = $reflectionService; + } + + /** + * Wakeup reflection after ClassMetadata gets unserialized from cache. + * + * @param ClassMetadataInfo $class + * @param ReflectionService $reflService + * @return void + */ + protected function wakeupReflection(ClassMetadataInfo $class, ReflectionService $reflService) + { + $class->wakeupReflection($reflService); + } + + /** + * Initialize Reflection after ClassMetadata was constructed. + * + * @param ClassMetadataInfo $class + * @param ReflectionService $reflService + * @return void + */ + protected function initializeReflection(ClassMetadataInfo $class, ReflectionService $reflService) + { + $class->initializeReflection($reflService); + } } diff --git a/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php b/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php index 56dd16385..08ce40a64 100644 --- a/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php +++ b/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php @@ -21,6 +21,7 @@ namespace Doctrine\ORM\Mapping; use Doctrine\DBAL\Types\Type; use ReflectionClass; +use Doctrine\Common\Persistence\Mapping\ClassMetadata; /** * A ClassMetadata instance holds all the object-relational mapping metadata @@ -40,7 +41,7 @@ use ReflectionClass; * @author Jonathan H. Wage * @since 2.0 */ -class ClassMetadataInfo +class ClassMetadataInfo implements ClassMetadata { /* The inheritance mapping types */ /** @@ -494,6 +495,20 @@ class ClassMetadataInfo */ public $isReadOnly = false; + /** + * The ReflectionProperty instances of the mapped class. + * + * @var array + */ + public $reflFields = array(); + + /** + * The prototype from which new instances of the mapped class are created. + * + * @var object + */ + private $_prototype; + /** * Initializes a new ClassMetadata instance that will hold the object-relational mapping * metadata of the class with the given name. @@ -506,6 +521,308 @@ class ClassMetadataInfo $this->rootEntityName = $entityName; } + /** + * Gets the ReflectionPropertys of the mapped class. + * + * @return array An array of ReflectionProperty instances. + */ + public function getReflectionProperties() + { + return $this->reflFields; + } + + /** + * Gets a ReflectionProperty for a specific field of the mapped class. + * + * @param string $name + * @return ReflectionProperty + */ + public function getReflectionProperty($name) + { + return $this->reflFields[$name]; + } + + /** + * Gets the ReflectionProperty for the single identifier field. + * + * @return ReflectionProperty + * @throws BadMethodCallException If the class has a composite identifier. + */ + public function getSingleIdReflectionProperty() + { + if ($this->isIdentifierComposite) { + throw new \BadMethodCallException("Class " . $this->name . " has a composite identifier."); + } + return $this->reflFields[$this->identifier[0]]; + } + + /** + * Extracts the identifier values of an entity of this class. + * + * For composite identifiers, the identifier values are returned as an array + * with the same order as the field order in {@link identifier}. + * + * @param object $entity + * @return array + */ + public function getIdentifierValues($entity) + { + if ($this->isIdentifierComposite) { + $id = array(); + + foreach ($this->identifier as $idField) { + $value = $this->reflFields[$idField]->getValue($entity); + + if ($value !== null) { + $id[$idField] = $value; + } + } + + return $id; + } + + $value = $this->reflFields[$this->identifier[0]]->getValue($entity); + + if ($value !== null) { + return array($this->identifier[0] => $value); + } + + return array(); + } + + /** + * Populates the entity identifier of an entity. + * + * @param object $entity + * @param mixed $id + * @todo Rename to assignIdentifier() + */ + public function setIdentifierValues($entity, array $id) + { + foreach ($id as $idField => $idValue) { + $this->reflFields[$idField]->setValue($entity, $idValue); + } + } + + /** + * Sets the specified field to the specified value on the given entity. + * + * @param object $entity + * @param string $field + * @param mixed $value + */ + public function setFieldValue($entity, $field, $value) + { + $this->reflFields[$field]->setValue($entity, $value); + } + + /** + * Gets the specified field's value off the given entity. + * + * @param object $entity + * @param string $field + */ + public function getFieldValue($entity, $field) + { + return $this->reflFields[$field]->getValue($entity); + } + + /** + * Creates a string representation of this instance. + * + * @return string The string representation of this instance. + * @todo Construct meaningful string representation. + */ + public function __toString() + { + return __CLASS__ . '@' . spl_object_hash($this); + } + + /** + * Determines which fields get serialized. + * + * It is only serialized what is necessary for best unserialization performance. + * That means any metadata properties that are not set or empty or simply have + * their default value are NOT serialized. + * + * Parts that are also NOT serialized because they can not be properly unserialized: + * - reflClass (ReflectionClass) + * - reflFields (ReflectionProperty array) + * + * @return array The names of all the fields that should be serialized. + */ + public function __sleep() + { + // This metadata is always serialized/cached. + $serialized = array( + 'associationMappings', + 'columnNames', //TODO: Not really needed. Can use fieldMappings[$fieldName]['columnName'] + 'fieldMappings', + 'fieldNames', + 'identifier', + 'isIdentifierComposite', // TODO: REMOVE + 'name', + 'namespace', // TODO: REMOVE + 'table', + 'rootEntityName', + 'idGenerator', //TODO: Does not really need to be serialized. Could be moved to runtime. + ); + + // The rest of the metadata is only serialized if necessary. + if ($this->changeTrackingPolicy != self::CHANGETRACKING_DEFERRED_IMPLICIT) { + $serialized[] = 'changeTrackingPolicy'; + } + + if ($this->customRepositoryClassName) { + $serialized[] = 'customRepositoryClassName'; + } + + if ($this->inheritanceType != self::INHERITANCE_TYPE_NONE) { + $serialized[] = 'inheritanceType'; + $serialized[] = 'discriminatorColumn'; + $serialized[] = 'discriminatorValue'; + $serialized[] = 'discriminatorMap'; + $serialized[] = 'parentClasses'; + $serialized[] = 'subClasses'; + } + + if ($this->generatorType != self::GENERATOR_TYPE_NONE) { + $serialized[] = 'generatorType'; + if ($this->generatorType == self::GENERATOR_TYPE_SEQUENCE) { + $serialized[] = 'sequenceGeneratorDefinition'; + } + } + + if ($this->isMappedSuperclass) { + $serialized[] = 'isMappedSuperclass'; + } + + if ($this->containsForeignIdentifier) { + $serialized[] = 'containsForeignIdentifier'; + } + + if ($this->isVersioned) { + $serialized[] = 'isVersioned'; + $serialized[] = 'versionField'; + } + + if ($this->lifecycleCallbacks) { + $serialized[] = 'lifecycleCallbacks'; + } + + if ($this->namedQueries) { + $serialized[] = 'namedQueries'; + } + + if ($this->isReadOnly) { + $serialized[] = 'isReadOnly'; + } + + return $serialized; + } + + /** + * Creates a new instance of the mapped class, without invoking the constructor. + * + * @return object + */ + public function newInstance() + { + if ($this->_prototype === null) { + $this->_prototype = unserialize(sprintf('O:%d:"%s":0:{}', strlen($this->name), $this->name)); + } + + return clone $this->_prototype; + } + /** + * Restores some state that can not be serialized/unserialized. + * + * @param ReflectionService $reflService + * @return void + */ + public function wakeupReflection($reflService) + { + // Restore ReflectionClass and properties + $this->reflClass = $reflService->getClass($this->name); + + foreach ($this->fieldMappings as $field => $mapping) { + $this->reflFields[$field] = isset($mapping['declared']) + ? $reflService->getAccessibleProperty($mapping['declared'], $field) + : $reflService->getAccessibleProperty($this->name, $field); + } + + foreach ($this->associationMappings as $field => $mapping) { + $this->reflFields[$field] = isset($mapping['declared']) + ? $reflService->getAccessibleProperty($mapping['declared'], $field) + : $reflService->getAccessibleProperty($this->name, $field); + } + } + + /** + * Initializes a new ClassMetadata instance that will hold the object-relational mapping + * metadata of the class with the given name. + * + * @param string $entityName The name of the entity class the new instance is used for. + */ + public function initializeReflection($reflService) + { + $this->reflClass = $reflService->getClass($this->name); + $this->namespace = $reflService->getClassNamespace($this->name); + $this->table['name'] = $reflService->getClassShortName($this->name); + + if ($this->reflClass) { + $this->name = $this->rootEntityName = $this->reflClass->getName(); + } + } + + /** + * Validate Identifier + * + * @return void + */ + public function validateIdentifier() + { + // Verify & complete identifier mapping + if ( ! $this->identifier && ! $this->isMappedSuperclass) { + throw MappingException::identifierRequired($this->name); + } + + if ($this->usesIdGenerator() && $this->isIdentifierComposite) { + throw MappingException::compositeKeyAssignedIdGeneratorRequired($this->name); + } + } + + /** + * Validate association targets actually exist. + * + * @return void + */ + public function validateAssocations() + { + foreach ($this->associationMappings as $field => $mapping) { + if ( ! \Doctrine\Common\ClassLoader::classExists($mapping['targetEntity']) ) { + throw MappingException::invalidTargetEntityClass($mapping['targetEntity'], $this->name, $mapping['fieldName']); + } + } + } + + /** + * Validate lifecycle callbacks + * + * @param ReflectionService $reflService + * @return void + */ + public function validateLifecycleCallbacks($reflService) + { + foreach ($this->lifecycleCallbacks as $event => $callbacks) { + foreach ($callbacks as $callbackFuncName) { + if ( ! $reflService->hasPublicMethod($this->name, $callbackFuncName)) { + throw MappingException::lifecycleCallbackMethodNotFound($this->name, $callbackFuncName); + } + } + } + } + /** * Gets the ReflectionClass instance of the mapped class. * @@ -513,9 +830,6 @@ class ClassMetadataInfo */ public function getReflectionClass() { - if ( ! $this->reflClass) { - $this->reflClass = new ReflectionClass($this->name); - } return $this->reflClass; } diff --git a/lib/Doctrine/ORM/Tools/DisconnectedClassMetadataFactory.php b/lib/Doctrine/ORM/Tools/DisconnectedClassMetadataFactory.php index f98c8bfae..2603c22f9 100644 --- a/lib/Doctrine/ORM/Tools/DisconnectedClassMetadataFactory.php +++ b/lib/Doctrine/ORM/Tools/DisconnectedClassMetadataFactory.php @@ -38,36 +38,8 @@ use Doctrine\ORM\Mapping\ClassMetadataInfo; */ class DisconnectedClassMetadataFactory extends ClassMetadataFactory { - /** - * @override - */ - protected function newClassMetadataInstance($className) + public function getReflectionService() { - $metadata = new ClassMetadataInfo($className); - if (strpos($className, "\\") !== false) { - $metadata->namespace = strrev(substr( strrev($className), strpos(strrev($className), "\\")+1 )); - } else { - $metadata->namespace = ""; - } - return $metadata; + return new \Doctrine\Common\Persistence\Mapping\StaticReflectionService; } - - /** - * Validate runtime metadata is correctly defined. - * - * @param ClassMetadata $class - * @param ClassMetadata $parent - */ - protected function validateRuntimeMetadata($class, $parent) - { - // validate nothing - } - - /** - * @override - */ - protected function getParentClasses($name) - { - return array(); - } -} \ No newline at end of file +} diff --git a/lib/vendor/doctrine-common b/lib/vendor/doctrine-common index 18d11e0a5..cc04744bc 160000 --- a/lib/vendor/doctrine-common +++ b/lib/vendor/doctrine-common @@ -1 +1 @@ -Subproject commit 18d11e0a54f8c4e726940a3753e3c2949dbf1c02 +Subproject commit cc04744bcf5a4743c46fae0487ac7a093a722856 diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC168Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC168Test.php index 25b63a8dc..0b5378040 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC168Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC168Test.php @@ -61,4 +61,4 @@ class DDC168Test extends \Doctrine\Tests\OrmFunctionalTestCase $this->assertInstanceOf('Doctrine\Tests\Models\Company\CompanyEmployee', $theEmployee); $this->assertInstanceOf('Doctrine\Tests\Models\Company\CompanyEmployee', $theEmployee->getSpouse()); } -} \ No newline at end of file +} diff --git a/tests/Doctrine/Tests/ORM/Mapping/AbstractMappingDriverTest.php b/tests/Doctrine/Tests/ORM/Mapping/AbstractMappingDriverTest.php index 0042259e1..6d14c2ac7 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/AbstractMappingDriverTest.php +++ b/tests/Doctrine/Tests/ORM/Mapping/AbstractMappingDriverTest.php @@ -18,6 +18,7 @@ abstract class AbstractMappingDriverTest extends \Doctrine\Tests\OrmTestCase $mappingDriver = $this->_loadDriver(); $class = new ClassMetadata($entityClassName); + $class->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); $mappingDriver->loadMetadataForClass($entityClassName, $class); return $class; diff --git a/tests/Doctrine/Tests/ORM/Mapping/AnnotationDriverTest.php b/tests/Doctrine/Tests/ORM/Mapping/AnnotationDriverTest.php index dae4cd27a..4d7715ebb 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/AnnotationDriverTest.php +++ b/tests/Doctrine/Tests/ORM/Mapping/AnnotationDriverTest.php @@ -15,6 +15,7 @@ class AnnotationDriverTest extends AbstractMappingDriverTest public function testLoadMetadataForNonEntityThrowsException() { $cm = new ClassMetadata('stdClass'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); $reader = new \Doctrine\Common\Annotations\AnnotationReader(new \Doctrine\Common\Cache\ArrayCache()); $annotationDriver = new \Doctrine\ORM\Mapping\Driver\AnnotationDriver($reader); @@ -28,6 +29,7 @@ class AnnotationDriverTest extends AbstractMappingDriverTest public function testColumnWithMissingTypeDefaultsToString() { $cm = new ClassMetadata('Doctrine\Tests\ORM\Mapping\ColumnWithoutType'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); $annotationDriver = $this->_loadDriver(); $annotationDriver->loadMetadataForClass('Doctrine\Tests\ORM\Mapping\InvalidColumn', $cm); diff --git a/tests/Doctrine/Tests/ORM/Mapping/BasicInheritanceMappingTest.php b/tests/Doctrine/Tests/ORM/Mapping/BasicInheritanceMappingTest.php index 0c739e9f8..ff7f04048 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/BasicInheritanceMappingTest.php +++ b/tests/Doctrine/Tests/ORM/Mapping/BasicInheritanceMappingTest.php @@ -91,6 +91,7 @@ class BasicInheritanceMappingTest extends \Doctrine\Tests\OrmTestCase $class = $this->_factory->getMetadataFor(__NAMESPACE__ . '\\EntitySubClass2'); $class2 = unserialize(serialize($class)); + $class2->wakeupReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); $this->assertTrue(isset($class2->reflFields['mapped1'])); $this->assertTrue(isset($class2->reflFields['mapped2'])); @@ -315,4 +316,4 @@ class MediumSuperclassEntity extends MediumSuperclassBase class SubclassWithRepository extends \Doctrine\Tests\Models\DDC869\DDC869Payment { -} \ No newline at end of file +} diff --git a/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataBuilderTest.php b/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataBuilderTest.php index 38cecd5cc..888db0d81 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataBuilderTest.php +++ b/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataBuilderTest.php @@ -40,6 +40,7 @@ class ClassMetadataBuilderTest extends \Doctrine\Tests\OrmTestCase public function setUp() { $this->cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser'); + $this->cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); $this->builder = new ClassMetadataBuilder($this->cm); } diff --git a/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataFactoryTest.php b/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataFactoryTest.php index 223ef8582..cd1e4f3ff 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataFactoryTest.php +++ b/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataFactoryTest.php @@ -27,6 +27,7 @@ class ClassMetadataFactoryTest extends \Doctrine\Tests\OrmTestCase // Self-made metadata $cm1 = new ClassMetadata('Doctrine\Tests\ORM\Mapping\TestEntity1'); + $cm1->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); $cm1->setPrimaryTable(array('name' => '`group`')); // Add a mapped field $cm1->mapField(array('fieldName' => 'name', 'type' => 'varchar')); @@ -43,9 +44,9 @@ class ClassMetadataFactoryTest extends \Doctrine\Tests\OrmTestCase $cm1->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_AUTO); // SUT - $cmf = new ClassMetadataFactoryTestSubject(); + $cmf = new \Doctrine\ORM\Mapping\ClassMetadataFactory(); $cmf->setEntityManager($entityManager); - $cmf->setMetadataForClass('Doctrine\Tests\ORM\Mapping\TestEntity1', $cm1); + $cmf->setMetadataFor('Doctrine\Tests\ORM\Mapping\TestEntity1', $cm1); // Prechecks $this->assertEquals(array(), $cm1->parentClasses); @@ -53,15 +54,16 @@ class ClassMetadataFactoryTest extends \Doctrine\Tests\OrmTestCase $this->assertTrue($cm1->hasField('name')); $this->assertEquals(2, count($cm1->associationMappings)); $this->assertEquals(ClassMetadata::GENERATOR_TYPE_AUTO, $cm1->generatorType); + $this->assertEquals('group', $cm1->table['name']); // Go - $cm1 = $cmf->getMetadataFor('Doctrine\Tests\ORM\Mapping\TestEntity1'); + $cmMap1 = $cmf->getMetadataFor('Doctrine\Tests\ORM\Mapping\TestEntity1'); - $this->assertEquals('group', $cm1->table['name']); - $this->assertTrue($cm1->table['quoted']); - $this->assertEquals(array(), $cm1->parentClasses); - $this->assertTrue($cm1->hasField('name')); - $this->assertEquals(ClassMetadata::GENERATOR_TYPE_SEQUENCE, $cm1->generatorType); + $this->assertSame($cm1, $cmMap1); + $this->assertEquals('group', $cmMap1->table['name']); + $this->assertTrue($cmMap1->table['quoted']); + $this->assertEquals(array(), $cmMap1->parentClasses); + $this->assertTrue($cmMap1->hasField('name')); } public function testHasGetMetadata_NamespaceSeperatorIsNotNormalized() diff --git a/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php b/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php index 7a4de4ca4..d100f6f5c 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php +++ b/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php @@ -13,6 +13,7 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase public function testClassMetadataInstanceSerialization() { $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); // Test initial state $this->assertTrue(count($cm->getReflectionProperties()) == 0); @@ -36,6 +37,7 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase $serialized = serialize($cm); $cm = unserialize($serialized); + $cm->wakeupReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); // Check state $this->assertTrue(count($cm->getReflectionProperties()) > 0); @@ -60,6 +62,7 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase public function testFieldIsNullable() { $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); // Explicit Nullable $cm->mapField(array('fieldName' => 'status', 'nullable' => true, 'type' => 'string', 'length' => 50)); @@ -82,6 +85,7 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase require_once __DIR__."/../../Models/Global/GlobalNamespaceModel.php"; $cm = new ClassMetadata('DoctrineGlobal_Article'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); $cm->mapManyToMany(array( 'fieldName' => 'author', 'targetEntity' => 'DoctrineGlobal_User', @@ -98,6 +102,7 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase public function testMapManyToManyJoinTableDefaults() { $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); $cm->mapManyToMany( array( 'fieldName' => 'groups', @@ -117,6 +122,7 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase public function testSerializeManyToManyJoinTableCascade() { $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); $cm->mapManyToMany( array( 'fieldName' => 'groups', @@ -138,6 +144,7 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase require_once __DIR__."/../../Models/Global/GlobalNamespaceModel.php"; $cm = new ClassMetadata('DoctrineGlobal_User'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); $cm->setDiscriminatorMap(array('descr' => 'DoctrineGlobal_Article', 'foo' => 'DoctrineGlobal_User')); $this->assertEquals("DoctrineGlobal_Article", $cm->discriminatorMap['descr']); @@ -152,6 +159,7 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase require_once __DIR__."/../../Models/Global/GlobalNamespaceModel.php"; $cm = new ClassMetadata('DoctrineGlobal_User'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); $cm->setSubclasses(array('DoctrineGlobal_Article')); $this->assertEquals("DoctrineGlobal_Article", $cm->subClasses[0]); @@ -167,6 +175,7 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase $field['type'] = 'string'; $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); $this->setExpectedException('Doctrine\ORM\Mapping\MappingException'); $cm->setVersionMapping($field); @@ -175,6 +184,7 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase public function testGetSingleIdentifierFieldName_MultipleIdentifierEntity_ThrowsException() { $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); $cm->isIdentifierComposite = true; $this->setExpectedException('Doctrine\ORM\Mapping\MappingException'); @@ -184,6 +194,8 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase public function testDuplicateAssociationMappingException() { $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); + $a1 = array('fieldName' => 'foo', 'sourceEntity' => 'stdClass', 'targetEntity' => 'stdClass', 'mappedBy' => 'foo'); $a2 = array('fieldName' => 'foo', 'sourceEntity' => 'stdClass', 'targetEntity' => 'stdClass', 'mappedBy' => 'foo'); @@ -195,6 +207,8 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase public function testDuplicateColumnName_ThrowsMappingException() { $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); + $cm->mapField(array('fieldName' => 'name', 'columnName' => 'name')); $this->setExpectedException('Doctrine\ORM\Mapping\MappingException'); @@ -204,6 +218,8 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase public function testDuplicateColumnName_DiscriminatorColumn_ThrowsMappingException() { $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); + $cm->mapField(array('fieldName' => 'name', 'columnName' => 'name')); $this->setExpectedException('Doctrine\ORM\Mapping\MappingException'); @@ -213,6 +229,8 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase public function testDuplicateColumnName_DiscriminatorColumn2_ThrowsMappingException() { $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); + $cm->setDiscriminatorColumn(array('name' => 'name')); $this->setExpectedException('Doctrine\ORM\Mapping\MappingException'); @@ -222,6 +240,8 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase public function testDuplicateFieldAndAssocationMapping1_ThrowsException() { $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); + $cm->mapField(array('fieldName' => 'name', 'columnName' => 'name')); $this->setExpectedException('Doctrine\ORM\Mapping\MappingException'); @@ -231,6 +251,8 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase public function testDuplicateFieldAndAssocationMapping2_ThrowsException() { $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); + $cm->mapOneToOne(array('fieldName' => 'name', 'targetEntity' => 'CmsUser')); $this->setExpectedException('Doctrine\ORM\Mapping\MappingException'); @@ -243,6 +265,8 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase public function testGetTemporaryTableNameSchema() { $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); + $cm->setTableName('foo.bar'); $this->assertEquals('foo_bar_id_tmp', $cm->getTemporaryIdTableName()); @@ -251,6 +275,7 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase public function testDefaultTableName() { $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); // When table's name is not given $primaryTable = array(); @@ -260,6 +285,7 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase $this->assertEquals('CmsUser', $cm->table['name']); $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsAddress'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); // When joinTable's name is not given $cm->mapManyToMany(array( 'fieldName' => 'user', @@ -273,6 +299,8 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase public function testDefaultJoinColumnName() { $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsAddress'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); + // this is really dirty, but it's the simpliest way to test whether // joinColumn's name will be automatically set to user_id $cm->mapOneToOne(array( @@ -282,6 +310,7 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase $this->assertEquals('user_id', $cm->associationMappings['user']['joinColumns'][0]['name']); $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsAddress'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); $cm->mapManyToMany(array( 'fieldName' => 'user', 'targetEntity' => 'CmsUser', @@ -299,6 +328,8 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase public function testSetMultipleIdentifierSetsComposite() { $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); + $cm->mapField(array('fieldName' => 'name')); $cm->mapField(array('fieldName' => 'username')); @@ -312,6 +343,7 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase public function testMappingNotFound() { $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); $this->setExpectedException('Doctrine\ORM\Mapping\MappingException', "No mapping found for field 'foo' on class 'Doctrine\Tests\Models\CMS\CmsUser'."); $cm->getFieldMapping('foo'); @@ -323,6 +355,8 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase public function testJoinTableMappingDefaults() { $cm = new ClassMetadata('DoctrineGlobal_Article'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); + $cm->mapManyToMany(array('fieldName' => 'author', 'targetEntity' => 'Doctrine\Tests\Models\CMS\CmsUser')); $this->assertEquals('doctrineglobal_article_cmsuser', $cm->associationMappings['author']['joinTable']['name']); @@ -334,6 +368,8 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase public function testMapIdentifierAssociation() { $cm = new ClassMetadata('Doctrine\Tests\Models\DDC117\DDC117ArticleDetails'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); + $cm->mapOneToOne(array( 'fieldName' => 'article', 'id' => true, @@ -351,6 +387,7 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase public function testOrphanRemovalIdentifierAssociation() { $cm = new ClassMetadata('Doctrine\Tests\Models\DDC117\DDC117ArticleDetails'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); $this->setExpectedException('Doctrine\ORM\Mapping\MappingException', 'The orphan removal option is not allowed on an association that'); $cm->mapOneToOne(array( @@ -368,6 +405,8 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase public function testInverseIdentifierAssocation() { $cm = new ClassMetadata('Doctrine\Tests\Models\DDC117\DDC117ArticleDetails'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); + $this->setExpectedException('Doctrine\ORM\Mapping\MappingException', 'An inverse association is not allowed to be identifier in'); $cm->mapOneToOne(array( @@ -385,6 +424,8 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase public function testIdentifierAssocationManyToMany() { $cm = new ClassMetadata('Doctrine\Tests\Models\DDC117\DDC117ArticleDetails'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); + $this->setExpectedException('Doctrine\ORM\Mapping\MappingException', 'Many-to-many or one-to-many associations are not allowed to be identifier in'); $cm->mapManyToMany(array( @@ -403,12 +444,16 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase $this->setExpectedException('Doctrine\ORM\Mapping\MappingException', "The field or association mapping misses the 'fieldName' attribute in entity 'Doctrine\Tests\Models\CMS\CmsUser'."); $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); + $cm->mapField(array('fieldName' => '')); } public function testRetrievalOfNamedQueries() { $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); + $this->assertEquals(0, count($cm->getNamedQueries())); @@ -423,6 +468,8 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase public function testExistanceOfNamedQuery() { $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); + $cm->addNamedQuery(array( 'name' => 'all', @@ -436,6 +483,8 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase public function testRetrieveOfNamedQuery() { $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); + $cm->addNamedQuery(array( 'name' => 'userById', @@ -448,6 +497,8 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase public function testNamingCollisionNamedQueryShouldThrowException() { $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); + $this->setExpectedException('Doctrine\ORM\Mapping\MappingException'); @@ -469,6 +520,8 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase { $user = new \Doctrine\Tests\Models\CMS\CmsUser(); $cm = new ClassMetadata('DOCTRINE\TESTS\MODELS\CMS\CMSUSER'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); + $this->assertEquals('Doctrine\Tests\Models\CMS\CmsUser', $cm->name); } @@ -478,9 +531,11 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase public function testLifecycleCallbackNotFound() { $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); + $cm->addLifecycleCallback('notfound', 'postLoad'); $this->setExpectedException("Doctrine\ORM\Mapping\MappingException", "Entity 'Doctrine\Tests\Models\CMS\CmsUser' has no method 'notfound' to be registered as lifecycle callback."); - $cm->addLifecycleCallback('notfound', 'postLoad'); + $cm->validateLifecycleCallbacks(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); } /** @@ -489,8 +544,10 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase public function testTargetEntityNotFound() { $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser'); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); + $cm->mapManyToOne(array('fieldName' => 'address', 'targetEntity' => 'UnknownClass')); $this->setExpectedException("Doctrine\ORM\Mapping\MappingException", "The target-entity Doctrine\Tests\Models\CMS\UnknownClass cannot be found in 'Doctrine\Tests\Models\CMS\CmsUser#address'."); - $cm->mapManyToOne(array('fieldName' => 'address', 'targetEntity' => 'UnknownClass')); + $cm->validateAssocations(); } } diff --git a/tests/Doctrine/Tests/ORM/Mapping/XmlMappingDriverTest.php b/tests/Doctrine/Tests/ORM/Mapping/XmlMappingDriverTest.php index e04543db0..6a852bc69 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/XmlMappingDriverTest.php +++ b/tests/Doctrine/Tests/ORM/Mapping/XmlMappingDriverTest.php @@ -21,6 +21,7 @@ class XmlMappingDriverTest extends AbstractMappingDriverTest $mappingDriver = $this->_loadDriver(); $class = new ClassMetadata($className); + $class->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); $mappingDriver->loadMetadataForClass($className, $class); $expectedMap = array( @@ -92,4 +93,4 @@ class CTI class CTIFoo extends CTI {} class CTIBar extends CTI {} -class CTIBaz extends CTI {} \ No newline at end of file +class CTIBaz extends CTI {} diff --git a/tests/Doctrine/Tests/ORM/Proxy/ProxyClassGeneratorTest.php b/tests/Doctrine/Tests/ORM/Proxy/ProxyClassGeneratorTest.php index 39bdcfe5a..a45ca2c1f 100644 --- a/tests/Doctrine/Tests/ORM/Proxy/ProxyClassGeneratorTest.php +++ b/tests/Doctrine/Tests/ORM/Proxy/ProxyClassGeneratorTest.php @@ -127,6 +127,7 @@ class ProxyClassGeneratorTest extends \Doctrine\Tests\OrmTestCase $className = "\DoctrineOrmTestEntity"; $proxyName = "DoctrineOrmTestEntityProxy"; $classMetadata = new \Doctrine\ORM\Mapping\ClassMetadata($className); + $classMetadata->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); $classMetadata->mapField(array('fieldName' => 'id', 'type' => 'integer')); $classMetadata->setIdentifier(array('id')); @@ -143,6 +144,7 @@ class ProxyClassGeneratorTest extends \Doctrine\Tests\OrmTestCase $className = "\Doctrine\Tests\ORM\Proxy\SleepClass"; $proxyName = "DoctrineTestsORMProxySleepClassProxy"; $classMetadata = new \Doctrine\ORM\Mapping\ClassMetadata($className); + $classMetadata->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); $classMetadata->mapField(array('fieldName' => 'id', 'type' => 'integer')); $classMetadata->setIdentifier(array('id')); diff --git a/tests/Doctrine/Tests/ORM/Tools/EntityGeneratorTest.php b/tests/Doctrine/Tests/ORM/Tools/EntityGeneratorTest.php index faf20afb1..4b02a94d1 100644 --- a/tests/Doctrine/Tests/ORM/Tools/EntityGeneratorTest.php +++ b/tests/Doctrine/Tests/ORM/Tools/EntityGeneratorTest.php @@ -167,6 +167,8 @@ class EntityGeneratorTest extends \Doctrine\Tests\OrmTestCase $book = $this->newInstance($metadata); $cm = new \Doctrine\ORM\Mapping\ClassMetadata($metadata->name); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); + $driver = $this->createAnnotationDriver(); $driver->loadMetadataForClass($cm->name, $cm); @@ -189,6 +191,8 @@ class EntityGeneratorTest extends \Doctrine\Tests\OrmTestCase $book = $this->newInstance($metadata); $cm = new \Doctrine\ORM\Mapping\ClassMetadata($metadata->name); + $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); + $driver->loadMetadataForClass($cm->name, $cm); $this->assertEquals($cm->columnNames, $metadata->columnNames); @@ -249,4 +253,4 @@ class } class EntityGeneratorAuthor {} -class EntityGeneratorComment {} \ No newline at end of file +class EntityGeneratorComment {} diff --git a/tests/Doctrine/Tests/OrmFunctionalTestCase.php b/tests/Doctrine/Tests/OrmFunctionalTestCase.php index 2d405e785..641826925 100644 --- a/tests/Doctrine/Tests/OrmFunctionalTestCase.php +++ b/tests/Doctrine/Tests/OrmFunctionalTestCase.php @@ -295,7 +295,11 @@ abstract class OrmFunctionalTestCase extends OrmTestCase // the actual database platform used during execution has effect on some // metadata mapping behaviors (like the choice of the ID generation). if (is_null(self::$_metadataCacheImpl)) { - self::$_metadataCacheImpl = new \Doctrine\Common\Cache\ArrayCache; + if (isset($GLOBALS['DOCTRINE_CACHE_IMPL'])) { + self::$_metadataCacheImpl = new $GLOBALS['DOCTRINE_CACHE_IMPL']; + } else { + self::$_metadataCacheImpl = new \Doctrine\Common\Cache\ArrayCache; + } } if (is_null(self::$_queryCacheImpl)) {