_schemaTool->createSchema(array( $this->_em->getClassMetadata('Doctrine\Tests\ORM\Functional\LifecycleCallbackTestEntity'), $this->_em->getClassMetadata('Doctrine\Tests\ORM\Functional\LifecycleCallbackTestUser'), $this->_em->getClassMetadata('Doctrine\Tests\ORM\Functional\LifecycleCallbackCascader'), )); } catch (\Exception $e) { // Swallow all exceptions. We do not test the schema tool here. } } public function testPreSavePostSaveCallbacksAreInvoked() { $entity = new LifecycleCallbackTestEntity; $entity->value = 'hello'; $this->_em->persist($entity); $this->_em->flush(); $this->assertTrue($entity->prePersistCallbackInvoked); $this->assertTrue($entity->postPersistCallbackInvoked); $this->_em->clear(); $query = $this->_em->createQuery("select e from Doctrine\Tests\ORM\Functional\LifecycleCallbackTestEntity e"); $result = $query->getResult(); $this->assertTrue($result[0]->postLoadCallbackInvoked); $result[0]->value = 'hello again'; $this->_em->flush(); $this->assertEquals('changed from preUpdate callback!', $result[0]->value); } public function testChangesDontGetLost() { $user = new LifecycleCallbackTestUser; $user->setName('Bob'); $user->setValue('value'); $this->_em->persist($user); $this->_em->flush(); $user->setName('Alice'); $this->_em->flush(); // Triggers preUpdate $this->_em->clear(); $user2 = $this->_em->find(get_class($user), $user->getId()); $this->assertEquals('Alice', $user2->getName()); $this->assertEquals('Hello World', $user2->getValue()); } /** * @group DDC-194 */ public function testGetReferenceWithPostLoadEventIsDelayedUntilProxyTrigger() { $entity = new LifecycleCallbackTestEntity; $entity->value = 'hello'; $this->_em->persist($entity); $this->_em->flush(); $id = $entity->getId(); $this->_em->clear(); $reference = $this->_em->getReference('Doctrine\Tests\ORM\Functional\LifecycleCallbackTestEntity', $id); $this->assertFalse($reference->postLoadCallbackInvoked); $reference->getId(); // trigger proxy load $this->assertTrue($reference->postLoadCallbackInvoked); } /** * @group DDC-113 */ public function testCascadedEntitiesCallsPrePersist() { $e1 = new LifecycleCallbackTestEntity; $e2 = new LifecycleCallbackTestEntity; $c = new LifecycleCallbackCascader(); $c->entities[] = $e1; $c->entities[] = $e2; $this->_em->persist($c); $this->_em->flush(); $this->assertTrue($e1->prePersistCallbackInvoked); $this->assertTrue($e2->prePersistCallbackInvoked); } } /** @Entity @HasLifecycleCallbacks */ class LifecycleCallbackTestUser { /** @Id @Column(type="integer") @GeneratedValue(strategy="AUTO") */ private $id; /** @Column(type="string") */ private $value; /** @Column(type="string") */ private $name; public function getId() {return $this->id;} public function getValue() {return $this->value;} public function setValue($value) {$this->value = $value;} public function getName() {return $this->name;} public function setName($name) {$this->name = $name;} /** @PreUpdate */ public function testCallback() {$this->value = 'Hello World';} } /** * @Entity * @HasLifecycleCallbacks * @Table(name="lc_cb_test_entity") */ class LifecycleCallbackTestEntity { /* test stuff */ public $prePersistCallbackInvoked = false; public $postPersistCallbackInvoked = false; public $postLoadCallbackInvoked = false; /** * @Id @Column(type="integer") * @GeneratedValue(strategy="AUTO") */ private $id; /** * @Column(type="string", nullable=true) */ public $value; /** * @ManyToOne(targetEntity="LifecycleCallbackCascader") * @JoinColumn(name="cascader_id", referencedColumnName="id") */ public $cascader; public function getId() { return $this->id; } /** @PrePersist */ public function doStuffOnPrePersist() { $this->prePersistCallbackInvoked = true; } /** @PostPersist */ public function doStuffOnPostPersist() { $this->postPersistCallbackInvoked = true; } /** @PostLoad */ public function doStuffOnPostLoad() { $this->postLoadCallbackInvoked = true; } /** @PreUpdate */ public function doStuffOnPreUpdate() { $this->value = 'changed from preUpdate callback!'; } } /** * @Entity * @Table(name="lc_cb_test_cascade") */ class LifecycleCallbackCascader { /** * @Id @Column(type="integer") * @GeneratedValue(strategy="AUTO") */ private $id; /** * @OneToMany(targetEntity="LifecycleCallbackTestEntity", mappedBy="product", cascade={"persist"}) */ public $entities; public function __construct() { $this->entities = new \Doctrine\Common\Collections\ArrayCollection(); } }