From ec4bd256d506cec4fecefc803523fc55b71291ba Mon Sep 17 00:00:00 2001 From: beberlei Date: Mon, 15 Mar 2010 19:29:07 +0000 Subject: [PATCH] [2.0] DDC-412 - Fixed YAML Driver not allowing multiple lifecycle callbacks per event. Backwards-incompatible change --- .../ORM/Event/PreInsertUpdateEventArgs.php | 34 ------- .../ORM/Mapping/Driver/YamlDriver.php | 98 ++++++++++--------- .../ORM/Mapping/AbstractMappingDriverTest.php | 20 +++- .../Doctrine.Tests.ORM.Mapping.User.dcm.xml | 1 + .../Doctrine.Tests.ORM.Mapping.User.dcm.yml | 4 +- 5 files changed, 72 insertions(+), 85 deletions(-) delete mode 100644 lib/Doctrine/ORM/Event/PreInsertUpdateEventArgs.php diff --git a/lib/Doctrine/ORM/Event/PreInsertUpdateEventArgs.php b/lib/Doctrine/ORM/Event/PreInsertUpdateEventArgs.php deleted file mode 100644 index 4a168c9a5..000000000 --- a/lib/Doctrine/ORM/Event/PreInsertUpdateEventArgs.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @since 2.0 - */ -class PreInsertUpdateEventArgs extends EventArgs -{ - private $_entity; - private $_entityChangeSet; - - public function __construct($entity, array $changeSet) - { - $this->_entity = $entity; - $this->_entityChangeSet = $changeSet; - } - - public function getEntity() - { - return $this->_entity; - } - - public function getEntityChangeSet() - { - return $this->_entityChangeSet; - } -} - diff --git a/lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php b/lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php index 4e4196130..36fceb7b7 100644 --- a/lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php +++ b/lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php @@ -56,7 +56,7 @@ class YamlDriver extends AbstractFileDriver public function loadMetadataForClass($className, ClassMetadataInfo $metadata) { $element = $this->getElement($className); - + if ($element['type'] == 'entity') { $metadata->setCustomRepositoryClass( isset($element['repositoryClass']) ? $element['repositoryClass'] : null @@ -71,11 +71,11 @@ class YamlDriver extends AbstractFileDriver if (isset($element['table'])) { $metadata->primaryTable['name'] = $element['table']; } - + if (isset($element['schema'])) { $metadata->primaryTable['schema'] = $element['schema']; } - + if (isset($element['inheritanceType'])) { $metadata->setInheritanceType(constant('Doctrine\ORM\Mapping\ClassMetadata::INHERITANCE_TYPE_' . strtoupper($element['inheritanceType']))); } @@ -107,13 +107,13 @@ class YamlDriver extends AbstractFileDriver if ( ! isset($index['name'])) { $index['name'] = $name; } - + if (is_string($index['columns'])) { $columns = explode(',', $index['columns']); } else { $columns = $index['columns']; } - + $metadata->primaryTable['indexes'][$index['name']] = array( 'columns' => $columns ); @@ -126,13 +126,13 @@ class YamlDriver extends AbstractFileDriver if ( ! isset($unique['name'])) { $unique['name'] = $name; } - + if (is_string($unique['columns'])) { $columns = explode(',', $unique['columns']); } else { $columns = $unique['columns']; } - + $metadata->primaryTable['uniqueConstraints'][$unique['name']] = array( 'columns' => $columns ); @@ -147,11 +147,11 @@ class YamlDriver extends AbstractFileDriver 'fieldName' => $name, 'type' => $idElement['type'] ); - + if (isset($idElement['column'])) { $mapping['columnName'] = $idElement['column']; } - + $metadata->mapField($mapping); if (isset($idElement['generator'])) { @@ -217,7 +217,7 @@ class YamlDriver extends AbstractFileDriver if (isset($fieldMapping['columnDefinition'])) { $mapping['columnDefinition'] = $fieldMapping['columnDefinition']; } - + $metadata->mapField($mapping); } } @@ -229,16 +229,16 @@ class YamlDriver extends AbstractFileDriver 'fieldName' => $name, 'targetEntity' => $oneToOneElement['targetEntity'] ); - + if (isset($oneToOneElement['fetch'])) { $mapping['fetch'] = constant('Doctrine\ORM\Mapping\AssociationMapping::FETCH_' . $oneToOneElement['fetch']); } - + 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'])) { @@ -246,11 +246,11 @@ class YamlDriver extends AbstractFileDriver if (!isset($joinColumnElement['name'])) { $joinColumnElement['name'] = $name; } - + $joinColumns[] = $this->_getJoinColumnMapping($joinColumnElement); } } - + $mapping['joinColumns'] = $joinColumns; } @@ -270,11 +270,11 @@ class YamlDriver extends AbstractFileDriver 'targetEntity' => $oneToManyElement['targetEntity'], 'mappedBy' => $oneToManyElement['mappedBy'] ); - + if (isset($oneToManyElement['fetch'])) { $mapping['fetch'] = constant('Doctrine\ORM\Mapping\AssociationMapping::FETCH_' . $oneToManyElement['fetch']); } - + if (isset($oneToManyElement['cascade'])) { $mapping['cascade'] = $oneToManyElement['cascade']; } @@ -282,7 +282,7 @@ class YamlDriver extends AbstractFileDriver if (isset($oneToManyElement['orderBy'])) { $mapping['orderBy'] = $oneToManyElement['orderBy']; } - + $metadata->mapOneToMany($mapping); } } @@ -291,16 +291,16 @@ class YamlDriver extends AbstractFileDriver if (isset($element['manyToOne'])) { foreach ($element['manyToOne'] as $name => $manyToOneElement) { $mapping = array( - 'fieldName' => $name, + 'fieldName' => $name, 'targetEntity' => $manyToOneElement['targetEntity'] ); - + if (isset($manyToOneElement['fetch'])) { $mapping['fetch'] = constant('Doctrine\ORM\Mapping\AssociationMapping::FETCH_' . $manyToOneElement['fetch']); } - + $joinColumns = array(); - + if (isset($manyToOneElement['joinColumn'])) { $joinColumns[] = $this->_getJoinColumnMapping($manyToOneElement['joinColumn']); } else if (isset($manyToOneElement['joinColumns'])) { @@ -308,17 +308,17 @@ class YamlDriver extends AbstractFileDriver if (!isset($joinColumnElement['name'])) { $joinColumnElement['name'] = $name; } - + $joinColumns[] = $this->_getJoinColumnMapping($joinColumnElement); } } - + $mapping['joinColumns'] = $joinColumns; - + if (isset($manyToOneElement['cascade'])) { $mapping['cascade'] = $manyToOneElement['cascade']; } - + $metadata->mapManyToOne($mapping); } } @@ -330,11 +330,11 @@ class YamlDriver extends AbstractFileDriver 'fieldName' => $name, 'targetEntity' => $manyToManyElement['targetEntity'] ); - + if (isset($manyToManyElement['fetch'])) { $mapping['fetch'] = constant('Doctrine\ORM\Mapping\AssociationMapping::FETCH_' . $manyToManyElement['fetch']); } - + if (isset($manyToManyElement['mappedBy'])) { $mapping['mappedBy'] = $manyToManyElement['mappedBy']; } else if (isset($manyToManyElement['joinTable'])) { @@ -342,30 +342,30 @@ class YamlDriver extends AbstractFileDriver $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; } - + if (isset($manyToManyElement['cascade'])) { $mapping['cascade'] = $manyToManyElement['cascade']; } @@ -380,8 +380,10 @@ class YamlDriver extends AbstractFileDriver // Evaluate lifeCycleCallbacks if (isset($element['lifecycleCallbacks'])) { - foreach ($element['lifecycleCallbacks'] as $method => $type) { - $metadata->addLifecycleCallback($method, constant('\Doctrine\ORM\Events::' . $type)); + foreach ($element['lifecycleCallbacks'] as $type => $methods) { + foreach ($methods as $method) { + $metadata->addLifecycleCallback($method, constant('\Doctrine\ORM\Events::' . $type)); + } } } } @@ -389,7 +391,7 @@ class YamlDriver extends AbstractFileDriver /** * Constructs a joinColumn mapping array based on the information * found in the given join column element. - * + * * @param $joinColumnElement The array join column element * @return array The mapping array. */ @@ -399,23 +401,23 @@ class YamlDriver extends AbstractFileDriver 'name' => $joinColumnElement['name'], 'referencedColumnName' => $joinColumnElement['referencedColumnName'] ); - - if (isset($joinColumnElement['fieldName'])) { - $joinColumn['fieldName'] = (string) $joinColumnElement['fieldName']; - } - + + if (isset($joinColumnElement['fieldName'])) { + $joinColumn['fieldName'] = (string) $joinColumnElement['fieldName']; + } + if (isset($joinColumnElement['unique'])) { $joinColumn['unique'] = (bool) $joinColumnElement['unique']; } - + if (isset($joinColumnElement['nullable'])) { $joinColumn['nullable'] = (bool) $joinColumnElement['nullable']; } - + if (isset($joinColumnElement['onDelete'])) { $joinColumn['onDelete'] = $joinColumnElement['onDelete']; } - + if (isset($joinColumnElement['onUpdate'])) { $joinColumn['onUpdate'] = $joinColumnElement['onUpdate']; } @@ -423,10 +425,10 @@ class YamlDriver extends AbstractFileDriver if (isset($joinColumnElement['columnDefinition'])) { $joinColumn['columnDefinition'] = $joinColumnElement['columnDefinition']; } - + return $joinColumn; } - + /** * {@inheritdoc} */ diff --git a/tests/Doctrine/Tests/ORM/Mapping/AbstractMappingDriverTest.php b/tests/Doctrine/Tests/ORM/Mapping/AbstractMappingDriverTest.php index fb4fb4e30..a0cef775d 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/AbstractMappingDriverTest.php +++ b/tests/Doctrine/Tests/ORM/Mapping/AbstractMappingDriverTest.php @@ -154,7 +154,18 @@ abstract class AbstractMappingDriverTest extends \Doctrine\Tests\OrmTestCase } /** - * @depends testLifecycleCallbacks + * @depends testManyToManyAssociationWithCascadeAll + * @param ClassMetadata $class + */ + public function testLifecycleCallbacksSupportMultipleMethodNames($class) { + $this->assertEquals(count($class->lifecycleCallbacks['prePersist']), 2); + $this->assertEquals($class->lifecycleCallbacks['prePersist'][1], 'doOtherStuffOnPrePersistToo'); + + return $class; + } + + /** + * @depends testLifecycleCallbacksSupportMultipleMethodNames * @param ClassMetadata $class */ public function testJoinColumnUniqueAndNullable($class) @@ -220,6 +231,7 @@ class User */ public $groups; + /** * @PrePersist */ @@ -227,6 +239,12 @@ class User { } + /** + * @PrePersist + */ + public function doOtherStuffOnPrePersistToo() { + } + /** * @PostPersist */ 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 44ea3ae95..ecfafdc20 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 @@ -9,6 +9,7 @@ + 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 d5f9447c6..79ba6f7e3 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 @@ -47,5 +47,5 @@ Doctrine\Tests\ORM\Mapping\User: cascade: - all lifecycleCallbacks: - doStuffOnPrePersist: prePersist - doStuffOnPostPersist: postPersist \ No newline at end of file + prePersist: [ doStuffOnPrePersist, doOtherStuffOnPrePersistToo ] + postPersist: [ doStuffOnPostPersist ] \ No newline at end of file