Skip to content

DDC-2512: Lifecycle callbacks #3235

Closed
doctrinebot opened this Issue Jun 17, 2013 · 6 comments

2 participants

@doctrinebot

Jira issue originally created by user pcastrotigre:

Hi,

I would like to know if the only one thing i need to save an entity in a lifecycle listener is the $unitOfWork->scheduleForInsert($entity).

My requirement is to save a log in every action in the DB. So i need to save the old entity and the new entity in the DB. I am making this in the preupdate listener:

$log = $this->util->createLog($entity->serialize(),"Current Object");             
$unitOfWork    = $this->wrapped->getUnitOfWork();                
$unitOfWork->scheduleForInsert($log);

But this log is never saved. Do i need something else to persist this new entity?.

Thanks for your help.

@doctrinebot

Comment created by @ocramius:

It is not safe to schedule operations while they are happening. Please use the onFlush event instead, as described in http://stackoverflow.com/questions/15092965/create-entity-on-entitiy-flush

Copying the example for reference:

namespace YourApp\Subscriber;

use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Event\OnFlushEventArgs;
use Doctrine\ORM\Events;
use YourApp\Entity\Issue;
use YourApp\Entity\IssueLog;

class IssueUpdateSubscriber implements EventSubscriber
{
    public function onFlush(OnFlushEventArgs $args)
    {
        $em  = $args->getEntityManager();
        $uow = $em->getUnitOfWork();

        foreach ($uow->getScheduledEntityUpdates() as $updated) {
            if ($updated instanceof Issue) {
                $em->persist(new IssueLog($updated));
            }
        }

        $uow->computeChangeSets();
    }

    public function getSubscribedEvents()
    {
        return array(Events::onFlush);
    }
}
@doctrinebot

Comment created by @ocramius:

Not an issue - unsafe usage of the preUpdate event

@doctrinebot

Issue was closed with resolution "Invalid"

@doctrinebot

Comment created by pcastrotigre:

In this method (onflush) I get the new entity (updated).

How could I get the old entity with old values?... I would not like to use the

$uow->getEntityChangeSet($entity); 

because this one only returns every field modified, but I would like to save the whole old entity in my DB.

Even in the PreUpdate method, the entity gotten, is the new one, but i also need the old one.

Thanks for your help,

@doctrinebot

Comment created by @ocramius:

[~pcastrotigre] there is no "new entity" or "old entity": there's the old and the new values for it. The object being held in memory is always the same.

@doctrinebot

Comment created by pcastrotigre:

This way i could get the old values for primitive properties, but what about relationships?.. How could i get the old relationship and the new relationship ( This is a many to many relationship )

I am doing this:

$group = $eventArgs->getOldValue("groups");

Where "groups" is my relationship. But this throws an error saying "groups" is not a valid field for the entity.

Thanks.

@Ocramius Ocramius was assigned by doctrinebot Dec 6, 2015
@doctrinebot doctrinebot closed this Dec 6, 2015
@doctrinebot doctrinebot added the Bug label Dec 7, 2015
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.