prepersist preflush php events doctrine lifecycle

php - preflush - Cómo acceder a valores antiguos en PrePersist LifecycleCallback en Doctrine2



symfony doctrine preflush (1)

Depende de qué LifecycleEvent estamos hablando. PrePersist y PreUpdate son eventos diferentes.

PreUpdate se activa antes de que una entidad esté, así, actualizada. Esto le dará un objeto PreUpdateEventArgs , que es un objeto LifecycleEventArgs extendido. Esto le permitirá consultar los campos modificados y darle acceso al valor anterior y al nuevo:

if ($event->hasChangedField(''foo'')) { $oldValue = $event->getOldValue(''foo''); $newValue = $event->getNewValue(''foo''); }

También puede obtener todos los valores de campo modificados a través de getEntityChangeSet() , que le daría una matriz como esta:

array( ''foo'' => array( 0 => ''oldValue'', 1 => ''newValue'' ), // more changed fields (if any) … )

PrePersist , por otro lado, asume una nueva Entidad (piense en insertar una nueva fila). En PrePersist, obtendrá un objeto LifecycleEventArgs que solo tiene acceso a la Entity y al EntityManager . En teoría, puede obtener acceso a UnitOfWork (que realiza un seguimiento de todos los cambios en Entidades) a través de EntityManager , por lo que podría intentar hacer

$changeSet = $event->getEntityManager()->getUnitOfWork()->getEntityChangeSet( $event->getEntity() );

para obtener los cambios para la entidad que se persistirá. A continuación, puede verificar esta matriz para ver los campos modificados. Sin embargo, dado que estamos hablando de una inserción y no de una actualización, supongo que todos los campos se considerarán "cambiados" y es probable que los valores anteriores sean todos nulos. No estoy seguro, esto funcionará como lo necesites.

Referencia adicional: http://docs.doctrine-project.org/en/2.0.x/reference/events.html

Tengo una entidad en Doctrine2 y uso HasLivecycleCallbacks con PrePersist. En general, esto funciona bien, pero me gustaría cambiar la versión solo, cuando cambian ciertos campos de mi entidad. ¿Tengo la oportunidad de obtener los viejos valores? ¿O solo las llaves que se han cambiado?

/** * @ORM/HasLifecycleCallbacks */ class Person { /** * @PrePersist * @PreUpdate */ public function increaseVersion() { if ( $this->version == null ) { $this->version = 0; } // only do this, when a certain attribute changed $this->version++; } }