From fd89892cc95a61e64e53a1a95d2ee779e99ddcaf Mon Sep 17 00:00:00 2001 From: jwage Date: Mon, 24 Aug 2009 21:05:55 +0000 Subject: [PATCH] [2.0] Updating YAML and XML drivers to be synchronized with Annotations driver. --- doctrine-mapping.xsd | 10 +- .../ORM/Mapping/Driver/AnnotationDriver.php | 6 - lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php | 369 ++++++++++-------- .../ORM/Mapping/Driver/YamlDriver.php | 354 +++++++++-------- .../Tests/ORM/Mapping/MappingDriverTest.php | 12 + .../Doctrine.Tests.ORM.Mapping.User.dcm.xml | 7 +- .../Doctrine.Tests.ORM.Mapping.User.dcm.yml | 5 +- 7 files changed, 431 insertions(+), 332 deletions(-) diff --git a/doctrine-mapping.xsd b/doctrine-mapping.xsd index 359acd128..9a8a2f876 100644 --- a/doctrine-mapping.xsd +++ b/doctrine-mapping.xsd @@ -33,7 +33,7 @@ - + @@ -45,14 +45,14 @@ - - + + - + - + diff --git a/lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php b/lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php index 703a68add..ff02db1a5 100644 --- a/lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php +++ b/lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php @@ -112,12 +112,6 @@ class AnnotationDriver implements Driver $metadata->setDiscriminatorMap($discrMapAnnot->value); } - // Evaluate DoctrineSubClasses annotation - if (isset($classAnnotations['Doctrine\ORM\Mapping\SubClasses'])) { - $subClassesAnnot = $classAnnotations['Doctrine\ORM\Mapping\SubClasses']; - $metadata->setSubclasses($subClassesAnnot->value); - } - // Evaluate DoctrineChangeTrackingPolicy annotation if (isset($classAnnotations['Doctrine\ORM\Mapping\ChangeTrackingPolicy'])) { $changeTrackingAnnot = $classAnnotations['Doctrine\ORM\Mapping\ChangeTrackingPolicy']; diff --git a/lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php b/lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php index 1faf760da..c0251c0ee 100644 --- a/lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php +++ b/lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php @@ -41,193 +41,248 @@ class XmlDriver extends AbstractFileDriver */ public function loadMetadataForClass($className, ClassMetadata $metadata) { + $class = $metadata->getReflectionClass(); + $xmlRoot = $this->getElement($className); if ($xmlRoot->getName() == 'entity') { + $metadata->setCustomRepositoryClass( + isset($xmlRoot['repository-class']) ? $xmlRoot['repository-class'] : null + ); + } else if ($xmlRoot->getName() == 'mapped-superclass') { + $metadata->isMappedSuperclass = true; + } else { + throw DoctrineException::updateMe("$className is no entity or mapped superclass."); + } - // Evaluate attributes - if (isset($xmlRoot['table'])) { - $metadata->primaryTable['name'] = (string)$xmlRoot['table']; - } - if (isset($xmlRoot['schema'])) { - $metadata->primaryTable['schema'] = (string)$xmlRoot['schema']; - } - if (isset($xmlRoot['inheritance-type'])) { - $metadata->setInheritanceType((string)$xmlRoot['inheritance-type']); - } - - // Evaluate - if (isset($xmlRoot->indexes)) { - foreach ($xmlRoot->indexes->index as $index) { - $metadata->primaryTable['indexes'][$index['name']] = array('fields' => - explode(',', $index['columns'])); - } - } - - // Evaluate - if (isset($xmlRoot->{'unique-constraints'})) { - foreach ($xmlRoot->{'unique-constraints'}->{'unique-constraint'} as $unique) { - $metadata->primaryTable['uniqueConstraints'][] = explode(',', $unique['columns']); - } - } + // Evaluate attributes + if (isset($xmlRoot['table'])) { + $metadata->primaryTable['name'] = (string)$xmlRoot['table']; + } + if (isset($xmlRoot['schema'])) { + $metadata->primaryTable['schema'] = (string)$xmlRoot['schema']; + } + if (isset($xmlRoot['inheritance-type'])) { + $metadata->setInheritanceType((string)$xmlRoot['inheritance-type']); + } - // Evaluate mappings - if (isset($xmlRoot->field)) { - foreach ($xmlRoot->field as $fieldMapping) { - $mapping = array( - 'fieldName' => (string)$fieldMapping['name'], - 'type' => (string)$fieldMapping['type'] - ); - if (isset($fieldMapping['column'])) { - $mapping['columnName'] = (string)$fieldMapping['column']; - } - if (isset($fieldMapping['length'])) { - $mapping['length'] = (int)$fieldMapping['length']; - } - if (isset($fieldMapping['precision'])) { - $mapping['precision'] = (int)$fieldMapping['precision']; - } - if (isset($fieldMapping['scale'])) { - $mapping['scale'] = (int)$fieldMapping['scale']; - } - if (isset($fieldMapping['version']) && $fieldMapping['version']) { - $metadata->setVersionMapping($mapping); - } - $metadata->mapField($mapping); - } - } + // Evaluate + if (isset($xmlRoot->{'discriminator-column'})) { + $discrColumn = $xmlRoot->{'discriminator-column'}; + $metadata->setDiscriminatorColumn(array( + 'name' => (string)$discrColumn->name, + 'type' => (string)$discrColumn->type, + 'length' => (string)$discrColumn->length + )); + } - // Evaluate mappings - foreach ($xmlRoot->id as $idElement) { + // Evaluate + if (isset($xmlRoot->{'discriminator-map'})) { + $metadata->setDiscriminatorMap((array)$xmlRoot->{'discriminator-map'}); + } + + // Evaluate + if (isset($xmlRoot->{'change-tracking-policy'})) { + $metadata->setChangeTrackingPolicy((array)$xmlRoot->{'change-tracking-policy'}); + } + + // Evaluate + if (isset($xmlRoot->indexes)) { + foreach ($xmlRoot->indexes->index as $index) { + $metadata->primaryTable['indexes'][$index['name']] = array('fields' => + explode(',', $index['columns'])); + } + } + + // Evaluate + if (isset($xmlRoot->{'unique-constraints'})) { + foreach ($xmlRoot->{'unique-constraints'}->{'unique-constraint'} as $unique) { + $metadata->primaryTable['uniqueConstraints'][] = explode(',', $unique['columns']); + } + } + + // Evaluate mappings + if (isset($xmlRoot->field)) { + foreach ($xmlRoot->field as $fieldMapping) { $mapping = array( - 'id' => true, - 'fieldName' => (string)$idElement['name'], - 'type' => (string)$idElement['type'] + 'fieldName' => (string)$fieldMapping['name'], + 'type' => (string)$fieldMapping['type'] ); - if (isset($idElement['column'])) { - $mapping['columnName'] = (string)$idElement['column']; + if (isset($fieldMapping['column'])) { + $mapping['columnName'] = (string)$fieldMapping['column']; + } + if (isset($fieldMapping['length'])) { + $mapping['length'] = (int)$fieldMapping['length']; + } + if (isset($fieldMapping['precision'])) { + $mapping['precision'] = (int)$fieldMapping['precision']; + } + if (isset($fieldMapping['scale'])) { + $mapping['scale'] = (int)$fieldMapping['scale']; + } + if (isset($fieldMapping['version']) && $fieldMapping['version']) { + $metadata->setVersionMapping($mapping); } $metadata->mapField($mapping); + } + } - if (isset($idElement->generator)) { - $metadata->setIdGeneratorType(constant('Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_' - . (string)$idElement->generator['strategy'])); - } + // Evaluate mappings + foreach ($xmlRoot->id as $idElement) { + $mapping = array( + 'id' => true, + 'fieldName' => (string)$idElement['name'], + 'type' => (string)$idElement['type'] + ); + if (isset($idElement['column'])) { + $mapping['columnName'] = (string)$idElement['column']; + } + $metadata->mapField($mapping); + + if (isset($idElement->generator)) { + $metadata->setIdGeneratorType(constant('Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_' + . (string)$idElement->generator['strategy'])); } - // Evaluate mappings - if (isset($xmlRoot->{'one-to-one'})) { - foreach ($xmlRoot->{'one-to-one'} as $oneToOneElement) { - $mapping = array( - 'fieldName' => (string)$oneToOneElement['field'], - 'targetEntity' => (string)$oneToOneElement['target-entity'] - ); - if (isset($oneToOneElement['mapped-by'])) { - $mapping['mappedBy'] = (string)$oneToOneElement['mapped-by']; - } else { - $joinColumns = array(); - if (isset($oneToOneElement->{'join-column'})) { - $joinColumns[] = $this->_getJoinColumnMapping($oneToOneElement->{'join-column'}); - } else if (isset($oneToOneElement->{'join-columns'})) { - foreach ($oneToOneElement->{'join-columns'}->{'join-column'} as $joinColumnElement) { - $joinColumns[] = $this->_getJoinColumnMapping($joinColumnElement); - } - } else { - throw MappingException::invalidMapping($mapping['fieldName']); - } - $mapping['joinColumns'] = $joinColumns; - } - - if (isset($oneToOneElement->cascade)) { - $mapping['cascade'] = $this->_getCascadeMappings($oneToOneElement->cascade); - } - - $metadata->mapOneToOne($mapping); - } + // Check for SequenceGenerator/TableGenerator definition + if (isset($idElement->{'sequence-generator'})) { + $seqGenerator = $idElement->{'sequence-generator'}; + $metadata->setSequenceGeneratorDefinition(array( + 'sequenceName' => $seqGenerator->{'sequence-name'}, + 'allocationSize' => $seqGenerator->{'allocation-size'}, + 'initialValue' => $seqGeneratorAnnot->{'initial-value'} + )); + } else if (isset($idElement->{'table-generator'})) { + throw DoctrineException::tableIdGeneratorNotImplemented(); } + } - // Evaluate mappings - if (isset($xmlRoot->{'one-to-many'})) { - foreach ($xmlRoot->{'one-to-many'} as $oneToManyElement) { - $mapping = array( - 'fieldName' => (string)$oneToManyElement['field'], - 'targetEntity' => (string)$oneToManyElement['target-entity'], - 'mappedBy' => (string)$oneToManyElement['mapped-by'] - ); - if (isset($oneToManyElement->cascade)) { - $mapping['cascade'] = $this->_getCascadeMappings($oneToManyElement->cascade); - } - $metadata->mapOneToMany($mapping); - } - } - - // Evaluate mappings - if (isset($xmlRoot->{'many-to-one'})) { - foreach ($xmlRoot->{'many-to-one'} as $manyToOneElement) { - $mapping = array( - 'fieldName' => (string)$manyToOneElement['field'], - 'targetEntity' => (string)$manyToOneElement['target-entity'] - ); + // Evaluate mappings + if (isset($xmlRoot->{'one-to-one'})) { + foreach ($xmlRoot->{'one-to-one'} as $oneToOneElement) { + $mapping = array( + 'fieldName' => (string)$oneToOneElement['field'], + 'targetEntity' => (string)$oneToOneElement['target-entity'], + ); + if (isset($oneToOneElement['mapped-by'])) { + $mapping['mappedBy'] = (string)$oneToOneElement['mapped-by']; + } else { $joinColumns = array(); - if (isset($manyToOneElement->{'join-column'})) { - $joinColumns[] = $this->_getJoinColumnMapping($manyToOneElement->{'join-column'}); - } else if (isset($manyToOneElement->{'join-columns'})) { - foreach ($manyToOneElement->{'join-columns'}->{'join-column'} as $joinColumnElement) { - if (!isset($joinColumnElement['name'])) { - $joinColumnElement['name'] = $name; - } + if (isset($oneToOneElement->{'join-column'})) { + $joinColumns[] = $this->_getJoinColumnMapping($oneToOneElement->{'join-column'}); + } else if (isset($oneToOneElement->{'join-columns'})) { + foreach ($oneToOneElement->{'join-columns'}->{'join-column'} as $joinColumnElement) { $joinColumns[] = $this->_getJoinColumnMapping($joinColumnElement); } } else { throw MappingException::invalidMapping($mapping['fieldName']); } $mapping['joinColumns'] = $joinColumns; - if (isset($manyToOneElement->cascade)) { - $mapping['cascade'] = $this->_getCascadeMappings($manyToOneElement->cascade); - } - $metadata->mapManyToOne($mapping); } + if (isset($oneToOneElement->cascade)) { + $mapping['cascade'] = $this->_getCascadeMappings($oneToOneElement->cascade); + } + if (isset($oneToOneElement->{'orphan-removal'})) { + $mapping['orphanRemoval'] = (bool)$oneToOneElement->{'orphan-removal'}; + } + $metadata->mapOneToOne($mapping); } - - // Evaluate mappings - if (isset($xmlRoot->{'many-to-many'})) { - foreach ($xmlRoot->{'many-to-many'} as $manyToManyElement) { - $mapping = array( - 'fieldName' => (string)$manyToManyElement['field'], - 'targetEntity' => (string)$manyToManyElement['target-entity'] + } + + // Evaluate mappings + if (isset($xmlRoot->{'one-to-many'})) { + foreach ($xmlRoot->{'one-to-many'} as $oneToManyElement) { + $mapping = array( + 'fieldName' => (string)$oneToManyElement['field'], + 'targetEntity' => (string)$oneToManyElement['target-entity'], + 'mappedBy' => (string)$oneToManyElement['mapped-by'] + ); + if (isset($oneToManyElement->cascade)) { + $mapping['cascade'] = $this->_getCascadeMappings($oneToManyElement->cascade); + } + if (isset($oneToManyElement->{'orphan-removal'})) { + $mapping['orphanRemoval'] = (bool)$oneToManyElement->{'orphan-removal'}; + } + $metadata->mapOneToMany($mapping); + } + } + + // Evaluate mappings + if (isset($xmlRoot->{'many-to-one'})) { + foreach ($xmlRoot->{'many-to-one'} as $manyToOneElement) { + $mapping = array( + 'fieldName' => (string)$manyToOneElement['field'], + 'targetEntity' => (string)$manyToOneElement['target-entity'] + ); + $joinColumns = array(); + if (isset($manyToOneElement->{'join-column'})) { + $joinColumns[] = $this->_getJoinColumnMapping($manyToOneElement->{'join-column'}); + } else if (isset($manyToOneElement->{'join-columns'})) { + foreach ($manyToOneElement->{'join-columns'}->{'join-column'} as $joinColumnElement) { + if (!isset($joinColumnElement['name'])) { + $joinColumnElement['name'] = $name; + } + $joinColumns[] = $this->_getJoinColumnMapping($joinColumnElement); + } + } else { + throw MappingException::invalidMapping($mapping['fieldName']); + } + $mapping['joinColumns'] = $joinColumns; + if (isset($manyToOneElement->cascade)) { + $mapping['cascade'] = $this->_getCascadeMappings($manyToOneElement->cascade); + } + if (isset($manyToOneElement->{'orphan-removal'})) { + $mapping['orphanRemoval'] = (bool)$manyToOneElement->{'orphan-removal'}; + } + $metadata->mapManyToOne($mapping); + } + } + + // Evaluate mappings + if (isset($xmlRoot->{'many-to-many'})) { + foreach ($xmlRoot->{'many-to-many'} as $manyToManyElement) { + $mapping = array( + 'fieldName' => (string)$manyToManyElement['field'], + 'targetEntity' => (string)$manyToManyElement['target-entity'] + ); + if (isset($manyToManyElement['mappedBy'])) { + $mapping['mappedBy'] = (string)$manyToManyElement['mapped-by']; + } else if (isset($manyToManyElement->{'join-table'})) { + $joinTableElement = $manyToManyElement->{'join-table'}; + $joinTable = array( + 'name' => (string)$joinTableElement['name'] ); - - if (isset($manyToManyElement['mappedBy'])) { - $mapping['mappedBy'] = (string)$manyToManyElement['mapped-by']; - } else if (isset($manyToManyElement->{'join-table'})) { - $joinTableElement = $manyToManyElement->{'join-table'}; - $joinTable = array( - 'name' => (string)$joinTableElement['name'] - ); - if (isset($joinTableElement['schema'])) { - $joinTable['schema'] = (string)$joinTableElement['schema']; - } - foreach ($joinTableElement->{'join-columns'}->{'join-column'} as $joinColumnElement) { - $joinTable['joinColumns'][] = $this->_getJoinColumnMapping($joinColumnElement); - } - foreach ($joinTableElement->{'inverse-join-columns'}->{'join-column'} as $joinColumnElement) { - $joinTable['inverseJoinColumns'][] = $this->_getJoinColumnMapping($joinColumnElement); - } - $mapping['joinTable'] = $joinTable; - } else { - throw MappingException::invalidMapping($mapping['fieldName']); + if (isset($joinTableElement['schema'])) { + $joinTable['schema'] = (string)$joinTableElement['schema']; } - - if (isset($manyToManyElement->cascade)) { - $mapping['cascade'] = $this->_getCascadeMappings($manyToManyElement->cascade); + foreach ($joinTableElement->{'join-columns'}->{'join-column'} as $joinColumnElement) { + $joinTable['joinColumns'][] = $this->_getJoinColumnMapping($joinColumnElement); } + foreach ($joinTableElement->{'inverse-join-columns'}->{'join-column'} as $joinColumnElement) { + $joinTable['inverseJoinColumns'][] = $this->_getJoinColumnMapping($joinColumnElement); + } + $mapping['joinTable'] = $joinTable; + } else { + throw MappingException::invalidMapping($mapping['fieldName']); + } + if (isset($manyToManyElement->cascade)) { + $mapping['cascade'] = $this->_getCascadeMappings($manyToManyElement->cascade); + } + if (isset($manyToManyElement->{'orphan-removal'})) { + $mapping['orphanRemoval'] = (bool)$manyToManyElement->{'orphan-removal'}; + } + $metadata->mapManyToMany($mapping); + } + } - $metadata->mapManyToMany($mapping); + // Evaluate + if (isset($xmlRoot->{'lifecycle-listener'})) { + foreach ($xmlRoot->{'lifecycle-listener'} as $lifecycleListener) { + $method = $class->getMethod((string)$lifecycleListener['method']); + if ($method->isPublic()) { + $metadata->addLifecycleCallback($method->getName(), constant('\Doctrine\ORM\Events::' . (string)$lifecycleListener['type'])); } } - - } else if ($xmlRoot->getName() == 'mapped-superclass') { - throw MappingException::notImplemented('Mapped superclasses are not yet supported.'); } } diff --git a/lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php b/lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php index ae90b57c8..e5c7bde7c 100644 --- a/lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php +++ b/lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php @@ -42,141 +42,125 @@ class YamlDriver extends AbstractFileDriver public function loadMetadataForClass($className, ClassMetadata $metadata) { + $class = $metadata->getReflectionClass(); + $element = $this->getElement($className); if ($element['type'] == 'entity') { + $metadata->setCustomRepositoryClass( + isset($element['repositoryClass']) ? $xmlRoot['repositoryClass'] : null + ); + } else if ($element['type'] == 'mappedSuperclass') { + $metadata->isMappedSuperclass = true; + } else { + throw DoctrineException::updateMe("$className is no entity or mapped superclass."); + } - // Evaluate root level properties - if (isset($element['table'])) { - $metadata->primaryTable['name'] = $element['table']; - } - if (isset($element['schema'])) { - $metadata->primaryTable['schema'] = $element['schema']; - } - if (isset($element['inheritanceType'])) { - $metadata->setInheritanceType($element['inheritanceType']); - } + // Evaluate root level properties + if (isset($element['table'])) { + $metadata->primaryTable['name'] = $element['table']; + } + if (isset($element['schema'])) { + $metadata->primaryTable['schema'] = $element['schema']; + } + if (isset($element['inheritanceType'])) { + $metadata->setInheritanceType($element['inheritanceType']); + } - // Evaluate indexes - if (isset($element['indexes'])) { - foreach ($element['indexes'] as $index) { - $metadata->primaryTable['indexes'][$index['name']] = array('fields' => - explode(',', $index['columns'])); - } - } + // Evaluate discriminatorColumn + if (isset($element['discriminatorColumn'])) { + $discrColumn = $element['discriminatorColumn']; + $metadata->setDiscriminatorColumn(array( + 'name' => $discrColumn['name'], + 'type' => $discrColumn['type'], + 'length' => $discrColumn['length'] + )); + } - // Evaluate uniqueConstraints - if (isset($element['uniqueConstraints'])) { - foreach ($element['uniqueConstraints'] as $unique) { - $metadata->primaryTable['uniqueConstraints'][] = explode(',', $unique['columns']); - } - } + // Evaluate discriminatorMap + if (isset($element['discriminatorMap'])) { + $metadata->setDiscriminatorMap($element['discriminatorMap']); + } - // Evaluate fields - if (isset($element['fields'])) { - foreach ($element['fields'] as $name => $fieldMapping) { - $mapping = array( - 'fieldName' => $name, - 'type' => $fieldMapping['type'] - ); - if (isset($fieldMapping['column'])) { - $mapping['columnName'] = $fieldMapping['column']; - } - if (isset($fieldMapping['length'])) { - $mapping['length'] = $fieldMapping['length']; - } - if (isset($fieldMapping['precision'])) { - $mapping['precision'] = $fieldMapping['precision']; - } - if (isset($fieldMapping['scale'])) { - $mapping['scale'] = $fieldMapping['scale']; - } - if (isset($fieldMapping['version']) && $fieldMapping['version']) { - $metadata->setVersionMapping($mapping); - } - $metadata->mapField($mapping); - } - } + // Evaluate changeTrackingPolicy + if (isset($element['changeTrackingPolicy'])) { + $metadata->setChangeTrackingPolicy($element['changeTrackingPolicy']); + } - // Evaluate identifier settings - foreach ($element['id'] as $name => $idElement) { + // Evaluate indexes + if (isset($element['indexes'])) { + foreach ($element['indexes'] as $index) { + $metadata->primaryTable['indexes'][$index['name']] = array('fields' => + explode(',', $index['columns'])); + } + } + + // Evaluate uniqueConstraints + if (isset($element['uniqueConstraints'])) { + foreach ($element['uniqueConstraints'] as $unique) { + $metadata->primaryTable['uniqueConstraints'][] = explode(',', $unique['columns']); + } + } + + // Evaluate fields + if (isset($element['fields'])) { + foreach ($element['fields'] as $name => $fieldMapping) { $mapping = array( - 'id' => true, 'fieldName' => $name, - 'type' => $idElement['type'] + 'type' => $fieldMapping['type'] ); - if (isset($idElement['column'])) { - $mapping['columnName'] = $idElement['column']; + if (isset($fieldMapping['column'])) { + $mapping['columnName'] = $fieldMapping['column']; + } + if (isset($fieldMapping['length'])) { + $mapping['length'] = $fieldMapping['length']; + } + if (isset($fieldMapping['precision'])) { + $mapping['precision'] = $fieldMapping['precision']; + } + if (isset($fieldMapping['scale'])) { + $mapping['scale'] = $fieldMapping['scale']; + } + if (isset($fieldMapping['version']) && $fieldMapping['version']) { + $metadata->setVersionMapping($mapping); } $metadata->mapField($mapping); - - if (isset($idElement['generator'])) { - $metadata->setIdGeneratorType(constant('Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_' - . $idElement['generator']['strategy'])); - } } + } - // Evaluate oneToOne relationships - if (isset($element['oneToOne'])) { - foreach ($element['oneToOne'] as $name => $oneToOneElement) { - $mapping = array( - 'fieldName' => $name, - 'targetEntity' => $oneToOneElement['targetEntity'] - ); - if (isset($oneToOneElement['mappedBy'])) { - $mapping['mappedBy'] = $oneToOneElement['mappedBy']; - } else { - $joinColumns = array(); - if (isset($oneToOneElement['joinColumn'])) { - $joinColumns[] = $this->_getJoinColumnMapping($oneToOneElement['joinColumn']); - } else if (isset($oneToOneElement['joinColumns'])) { - foreach ($oneToOneElement['joinColumns'] as $name => $joinColumnElement) { - if (!isset($joinColumnElement['name'])) { - $joinColumnElement['name'] = $name; - } - $joinColumns[] = $this->_getJoinColumnMapping($joinColumnElement); - } - } else { - throw MappingException::invalidMapping($mapping['fieldName']); - } - $mapping['joinColumns'] = $joinColumns; - } - - if (isset($oneToOneElement['cascade'])) { - $mapping['cascade'] = $this->_getCascadeMappings($oneToOneElement['cascade']); - } - - $metadata->mapOneToOne($mapping); - } + // Evaluate identifier settings + foreach ($element['id'] as $name => $idElement) { + $mapping = array( + 'id' => true, + 'fieldName' => $name, + 'type' => $idElement['type'] + ); + if (isset($idElement['column'])) { + $mapping['columnName'] = $idElement['column']; } + $metadata->mapField($mapping); - // Evaluate oneToMany relationships - if (isset($element['oneToMany'])) { - foreach ($element['oneToMany'] as $name => $oneToManyElement) { - $mapping = array( - 'fieldName' => $name, - 'targetEntity' => $oneToManyElement['targetEntity'], - 'mappedBy' => $oneToManyElement['mappedBy'] - ); - if (isset($oneToManyElement['cascade'])) { - $mapping['cascade'] = $this->_getCascadeMappings($oneToManyElement['cascade']); - } - $metadata->mapOneToMany($mapping); - } + if (isset($idElement['generator'])) { + $metadata->setIdGeneratorType(constant('Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_' + . $idElement['generator']['strategy'])); } + } - // Evaluate manyToOne relationships - if (isset($element['manyToOne'])) { - foreach ($element['manyToOne'] as $name => $manyToOneElement) { - $mapping = array( - 'fieldName' => $name, - 'targetEntity' => $manyToOneElement['targetEntity'] - ); + // Evaluate oneToOne relationships + if (isset($element['oneToOne'])) { + foreach ($element['oneToOne'] as $name => $oneToOneElement) { + $mapping = array( + 'fieldName' => $name, + 'targetEntity' => $oneToOneElement['targetEntity'] + ); + if (isset($oneToOneElement['mappedBy'])) { + $mapping['mappedBy'] = $oneToOneElement['mappedBy']; + } else { $joinColumns = array(); - if (isset($manyToOneElement['joinColumn'])) { - $joinColumns[] = $this->_getJoinColumnMapping($manyToOneElement['joinColumn']); - } else if (isset($manyToOneElement['joinColumns'])) { - foreach ($manyToOneElement['joinColumns'] as $name => $joinColumnElement) { + if (isset($oneToOneElement['joinColumn'])) { + $joinColumns[] = $this->_getJoinColumnMapping($oneToOneElement['joinColumn']); + } else if (isset($oneToOneElement['joinColumns'])) { + foreach ($oneToOneElement['joinColumns'] as $name => $joinColumnElement) { if (!isset($joinColumnElement['name'])) { $joinColumnElement['name'] = $name; } @@ -186,58 +170,110 @@ class YamlDriver extends AbstractFileDriver throw MappingException::invalidMapping($mapping['fieldName']); } $mapping['joinColumns'] = $joinColumns; - if (isset($manyToOneElement['cascade'])) { - $mapping['cascade'] = $this->_getCascadeMappings($manyToOneElement['cascade']); - } - $metadata->mapManyToOne($mapping); } - } - // Evaluate manyToMany relationships - if (isset($element['manyToMany'])) { - foreach ($element['manyToMany'] as $name => $manyToManyElement) { - $mapping = array( - 'fieldName' => $name, - 'targetEntity' => $manyToManyElement['targetEntity'] + if (isset($oneToOneElement['cascade'])) { + $mapping['cascade'] = $this->_getCascadeMappings($oneToOneElement['cascade']); + } + + $metadata->mapOneToOne($mapping); + } + } + + // Evaluate oneToMany relationships + if (isset($element['oneToMany'])) { + foreach ($element['oneToMany'] as $name => $oneToManyElement) { + $mapping = array( + 'fieldName' => $name, + 'targetEntity' => $oneToManyElement['targetEntity'], + 'mappedBy' => $oneToManyElement['mappedBy'] + ); + if (isset($oneToManyElement['cascade'])) { + $mapping['cascade'] = $this->_getCascadeMappings($oneToManyElement['cascade']); + } + $metadata->mapOneToMany($mapping); + } + } + + // Evaluate manyToOne relationships + if (isset($element['manyToOne'])) { + foreach ($element['manyToOne'] as $name => $manyToOneElement) { + $mapping = array( + 'fieldName' => $name, + 'targetEntity' => $manyToOneElement['targetEntity'] + ); + $joinColumns = array(); + if (isset($manyToOneElement['joinColumn'])) { + $joinColumns[] = $this->_getJoinColumnMapping($manyToOneElement['joinColumn']); + } else if (isset($manyToOneElement['joinColumns'])) { + foreach ($manyToOneElement['joinColumns'] as $name => $joinColumnElement) { + if (!isset($joinColumnElement['name'])) { + $joinColumnElement['name'] = $name; + } + $joinColumns[] = $this->_getJoinColumnMapping($joinColumnElement); + } + } else { + throw MappingException::invalidMapping($mapping['fieldName']); + } + $mapping['joinColumns'] = $joinColumns; + if (isset($manyToOneElement['cascade'])) { + $mapping['cascade'] = $this->_getCascadeMappings($manyToOneElement['cascade']); + } + $metadata->mapManyToOne($mapping); + } + } + + // Evaluate manyToMany relationships + if (isset($element['manyToMany'])) { + foreach ($element['manyToMany'] as $name => $manyToManyElement) { + $mapping = array( + 'fieldName' => $name, + 'targetEntity' => $manyToManyElement['targetEntity'] + ); + + if (isset($manyToManyElement['mappedBy'])) { + $mapping['mappedBy'] = $manyToManyElement['mappedBy']; + } else if (isset($manyToManyElement['joinTable'])) { + $joinTableElement = $manyToManyElement['joinTable']; + $joinTable = array( + 'name' => $joinTableElement['name'] ); - - if (isset($manyToManyElement['mappedBy'])) { - $mapping['mappedBy'] = $manyToManyElement['mappedBy']; - } else if (isset($manyToManyElement['joinTable'])) { - $joinTableElement = $manyToManyElement['joinTable']; - $joinTable = array( - 'name' => $joinTableElement['name'] - ); - if (isset($joinTableElement['schema'])) { - $joinTable['schema'] = $joinTableElement['schema']; - } - foreach ($joinTableElement['joinColumns'] as $name => $joinColumnElement) { - if (!isset($joinColumnElement['name'])) { - $joinColumnElement['name'] = $name; - } - $joinTable['joinColumns'][] = $this->_getJoinColumnMapping($joinColumnElement); - } - foreach ($joinTableElement['inverseJoinColumns'] as $name => $joinColumnElement) { - if (!isset($joinColumnElement['name'])) { - $joinColumnElement['name'] = $name; - } - $joinTable['inverseJoinColumns'][] = $this->_getJoinColumnMapping($joinColumnElement); - } - $mapping['joinTable'] = $joinTable; - } else { - throw MappingException::invalidMapping($mapping['fieldName']); + if (isset($joinTableElement['schema'])) { + $joinTable['schema'] = $joinTableElement['schema']; } - - if (isset($manyToManyElement['cascade'])) { - $mapping['cascade'] = $this->_getCascadeMappings($manyToManyElement['cascade']); + foreach ($joinTableElement['joinColumns'] as $name => $joinColumnElement) { + if (!isset($joinColumnElement['name'])) { + $joinColumnElement['name'] = $name; + } + $joinTable['joinColumns'][] = $this->_getJoinColumnMapping($joinColumnElement); } + foreach ($joinTableElement['inverseJoinColumns'] as $name => $joinColumnElement) { + if (!isset($joinColumnElement['name'])) { + $joinColumnElement['name'] = $name; + } + $joinTable['inverseJoinColumns'][] = $this->_getJoinColumnMapping($joinColumnElement); + } + $mapping['joinTable'] = $joinTable; + } else { + throw MappingException::invalidMapping($mapping['fieldName']); + } + + if (isset($manyToManyElement['cascade'])) { + $mapping['cascade'] = $this->_getCascadeMappings($manyToManyElement['cascade']); + } - $metadata->mapManyToMany($mapping); + $metadata->mapManyToMany($mapping); + } + } + + // Evaluate lifeCycleListener + if (isset($element['lifecycleListeners'])) { + foreach ($element['lifecycleListeners'] as $method => $type) { + $method = $class->getMethod($method); + if ($method->isPublic()) { + $metadata->addLifecycleCallback($method->getName(), constant('\Doctrine\ORM\Events::'.$type)); } } - - } else if ($element['type'] == 'mapped-superclass') { - throw MappingException::notImplemented('Mapped superclasses are not yet supported.'); } } diff --git a/tests/Doctrine/Tests/ORM/Mapping/MappingDriverTest.php b/tests/Doctrine/Tests/ORM/Mapping/MappingDriverTest.php index fc0f93794..a129276bb 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/MappingDriverTest.php +++ b/tests/Doctrine/Tests/ORM/Mapping/MappingDriverTest.php @@ -97,6 +97,9 @@ class MappingDriverTest extends \Doctrine\Tests\OrmTestCase $this->assertTrue($class->associationMappings['groups'] instanceof \Doctrine\ORM\Mapping\ManyToManyMapping); $this->assertTrue(isset($class->associationMappings['groups'])); $this->assertTrue($class->associationMappings['groups']->isOwningSide); + $this->assertEquals(count($class->lifecycleCallbacks), 2); + $this->assertEquals($class->lifecycleCallbacks['prePersist'][0], 'doStuffOnPrePersist'); + $this->assertEquals($class->lifecycleCallbacks['postPersist'][0], 'doStuffOnPostPersist'); } } @@ -108,4 +111,13 @@ class User { private $groups; // ... rest of code omitted, irrelevant for the mapping tests + + public function doStuffOnPrePersist() + { + } + + public function doStuffOnPostPersist() + { + + } } \ No newline at end of file diff --git a/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.ORM.Mapping.User.dcm.xml b/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.ORM.Mapping.User.dcm.xml index 7f4b2c412..c8f32fe70 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.ORM.Mapping.User.dcm.xml +++ b/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.ORM.Mapping.User.dcm.xml @@ -7,10 +7,9 @@ - - - - + + + diff --git a/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.ORM.Mapping.User.dcm.yml b/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.ORM.Mapping.User.dcm.yml index 75f1add5c..09bc20cc4 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.ORM.Mapping.User.dcm.yml +++ b/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.ORM.Mapping.User.dcm.yml @@ -31,4 +31,7 @@ Doctrine\Tests\ORM\Mapping\User: referencedColumnName: id inverseJoinColumns: group_id: - referencedColumnName: id \ No newline at end of file + referencedColumnName: id + lifecycleListeners: + doStuffOnPrePersist: prePersist + doStuffOnPostPersist: postPersist \ No newline at end of file