From 4772cbfae6364637911dd0ab8cea49c15faba03a Mon Sep 17 00:00:00 2001 From: Geoffrey Wagner Date: Wed, 8 Jan 2014 20:58:50 -0600 Subject: [PATCH] Add a test addLifecycleCallback now only allows a callback once so we do not hook them twice --- .../ORM/Mapping/ClassMetadataInfo.php | 3 + .../ORM/Mapping/Driver/AnnotationDriver.php | 10 +- .../ORM/Functional/Ticket/DDC2895Test.php | 113 ++++++++++++++++++ 3 files changed, 122 insertions(+), 4 deletions(-) create mode 100644 tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2895Test.php diff --git a/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php b/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php index 8a1a6587f..cc73a0e23 100644 --- a/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php +++ b/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php @@ -2550,6 +2550,9 @@ class ClassMetadataInfo implements ClassMetadata */ public function addLifecycleCallback($callback, $event) { + if(isset($this->lifecycleCallbacks[$event]) && in_array($callback, $this->lifecycleCallbacks[$event])) + return; + $this->lifecycleCallbacks[$event][] = $callback; } diff --git a/lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php b/lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php index e35921130..78ea05ea6 100644 --- a/lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php +++ b/lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php @@ -466,11 +466,13 @@ class AnnotationDriver extends AbstractAnnotationDriver } // Evaluate @HasLifecycleCallbacks annotation - if (isset($classAnnotations['Doctrine\ORM\Mapping\HasLifecycleCallbacks'])) { + if (isset($classAnnotations['Doctrine\ORM\Mapping\HasLifecycleCallbacks'])) + { /* @var $method \ReflectionMethod */ - foreach ($class->getMethods(\ReflectionMethod::IS_PUBLIC) as $method) { - - foreach ($this->getMethodCallbacks($method) as $value) { + foreach ($class->getMethods(\ReflectionMethod::IS_PUBLIC) as $method) + { + foreach ($this->getMethodCallbacks($method) as $value) + { $metadata->addLifecycleCallback($value[0], $value[1]); } } diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2895Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2895Test.php new file mode 100644 index 000000000..01a6d5c22 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2895Test.php @@ -0,0 +1,113 @@ +_schemaTool->createSchema(array( + $this->_em->getClassMetadata(__NAMESPACE__ . '\\DDC2895'), + )); + } catch(\Exception $e) { + + } + } + + public function testPostLoadOneToManyInheritance() + { + $cm = $this->_em->getClassMetadata(__NAMESPACE__ . '\\DDC2895'); + + $this->assertEquals( + array( + "prePersist" => array("setLastModifiedPreUpdate"), + "preUpdate" => array("setLastModifiedPreUpdate"), + ), + $cm->lifecycleCallbacks + ); + + $ddc2895 = new DDC2895(); + + $this->_em->persist($ddc2895); + $this->_em->flush(); + $this->_em->clear(); + + /** @var DDC2895 $ddc2895 */ + $ddc2895 = $this->_em->find(get_class($ddc2895), $ddc2895->id); + + $this->assertNotNull($ddc2895->getLastModified()); + + } +} + +/** + * @MappedSuperclass + * @HasLifecycleCallbacks + */ +abstract class AbstractDDC2895 +{ + /** + * @Column(name="last_modified", type="datetimetz", nullable=false) + * @var \DateTime + */ + protected $lastModified; + + /** + * @PrePersist + * @PreUpdate + */ + public function setLastModifiedPreUpdate() + { + $this->setLastModified(new \DateTime()); + } + + /** + * @param \DateTime $lastModified + */ + public function setLastModified( $lastModified ) + { + $this->lastModified = $lastModified; + } + + /** + * @return \DateTime + */ + public function getLastModified() + { + return $this->lastModified; + } +} + +/** + * @Entity + * @HasLifecycleCallbacks + */ +class DDC2895 extends AbstractDDC2895 +{ + /** @Id @GeneratedValue @Column(type="integer") */ + public $id; + + /** + * @param mixed $id + */ + public function setId( $id ) + { + $this->id = $id; + } + + /** + * @return mixed + */ + public function getId() + { + return $this->id; + } +} \ No newline at end of file