Skip to content

Commit

Permalink
support @LifecycleCallback in @EntityListeners
Browse files Browse the repository at this point in the history
  • Loading branch information
FabioBatSilva authored and fabio.silva committed Jan 29, 2013
1 parent 7021f00 commit fd6f592
Show file tree
Hide file tree
Showing 6 changed files with 86 additions and 1 deletion.
8 changes: 8 additions & 0 deletions lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php
Expand Up @@ -435,6 +435,14 @@ public function loadMetadataForClass($className, ClassMetadata $metadata)
}
}
}

// evaluate as lifecycle callback if the listener class is not given.
if(empty($entityListenersAnnot->value)) {
/* @var $method \Doctrine\ORM\Mapping\LifecycleCallback */
foreach ($entityListenersAnnot->callbacks as $callback) {
$metadata->addLifecycleCallback($callback->method, $callback->event);
}
}
}

// Evaluate @HasLifecycleCallbacks annotation
Expand Down
1 change: 1 addition & 0 deletions lib/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php
Expand Up @@ -65,3 +65,4 @@
require_once __DIR__.'/../AttributeOverride.php';
require_once __DIR__.'/../AttributeOverrides.php';
require_once __DIR__.'/../EntityListeners.php';
require_once __DIR__.'/../LifecycleCallback.php';
9 changes: 8 additions & 1 deletion lib/Doctrine/ORM/Mapping/EntityListeners.php
Expand Up @@ -37,5 +37,12 @@ final class EntityListeners implements Annotation
*
* @var array<string>
*/
public $value;
public $value = array();

/**
* Specifies the entity the entity lifecycle callbacks.
*
* @var array<\Doctrine\ORM\Mapping\LifecycleCallback>
*/
public $callbacks = array();
}
41 changes: 41 additions & 0 deletions lib/Doctrine/ORM/Mapping/LifecycleCallback.php
@@ -0,0 +1,41 @@
<?php

/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/

namespace Doctrine\ORM\Mapping;

/**
* @author Fabio B. Silva <fabio.bat.silva@gmail.com>
* @since 2.4
*
* @Annotation
* @Target("ANNOTATION")
*/
final class LifecycleCallback implements Annotation
{
/**
* @var string
*/
public $event;

/**
* @var string
*/
public $method;
}
11 changes: 11 additions & 0 deletions tests/Doctrine/Tests/Models/Company/CompanyPerson.php
Expand Up @@ -15,6 +15,9 @@
* "manager" = "CompanyManager",
* "employee" = "CompanyEmployee"
* })
* @EntityListeners(callbacks = {
* @LifecycleCallback(\Doctrine\ORM\Events::prePersist, method = "prePersistHandler")
* })
*
* @NamedNativeQueries({
* @NamedNativeQuery(
Expand Down Expand Up @@ -79,6 +82,8 @@ class CompanyPerson
*/
private $friends;

public $prePersistHandlerCalls = array();

public function __construct() {
$this->friends = new \Doctrine\Common\Collections\ArrayCollection;
}
Expand Down Expand Up @@ -117,6 +122,12 @@ public function setSpouse(CompanyPerson $spouse) {
}
}

public function prePersistHandler($event)
{
$this->prePersistHandlerCalls[] = $event;
}


public static function loadMetadata(\Doctrine\ORM\Mapping\ClassMetadataInfo $metadata)
{

Expand Down
17 changes: 17 additions & 0 deletions tests/Doctrine/Tests/ORM/Functional/LifecycleCallbackTest.php
Expand Up @@ -254,6 +254,23 @@ public function testLifecycleCallbackEventArgs()
$e->calls['postRemoveHandler']
);
}
/**
* @group DDC-1955
*/
public function testEventListenersLifecycleCallback()
{
$e = new \Doctrine\Tests\Models\Company\CompanyPerson;
$e->setName('Fabio B. Silva');

$this->_em->persist($e);
$this->_em->flush();

$this->assertCount(1, $e->prePersistHandlerCalls);
$this->assertInstanceOf(
'Doctrine\ORM\Event\LifecycleEventArgs',
$e->prePersistHandlerCalls[0]
);
}
}

/** @Entity @HasLifecycleCallbacks */
Expand Down

0 comments on commit fd6f592

Please sign in to comment.