Das erste, was ich überprüfen würde, dass Ihre setName Funktion tatsächlich etwas tut ($ this-> name = $ name ...) Wenn es bereits funktioniert, dann könnten Sie einen Ereignis-Listener auf Ihre Dienste definieren .yml, die ausgelöst wird, wenn Sie den Flush aufrufen.
entity.listener:
class: YourName\YourBundle\EventListener\EntityListener
calls:
- [setContainer, ["@service_container"]]
tags:
- { name: doctrine.event_listener, event: onFlush }
Dann definieren Sie die EntityListener
namespace YourName\YourBundle\EventListener;
use Doctrine\ORM\Event;
use Symfony\Component\DependencyInjection\ContainerAware;
class EntityListener extends ContainerAware
{
/**
* Gets all the entities to flush
*
* @param Event\OnFlushEventArgs $eventArgs Event args
*/
public function onFlush(Event\OnFlushEventArgs $eventArgs)
{
$em = $eventArgs->getEntityManager();
$uow = $em->getUnitOfWork();
//Insertions
foreach ($uow->getScheduledEntityInsertions() as $entity) {
# your code here for the inserted entities
}
//Updates
foreach ($uow->getScheduledEntityUpdates() as $entity) {
# your code here for the updated entities
}
//Deletions
foreach ($uow->getScheduledEntityDeletions() as $entity) {
# your code here for the deleted entities
}
}
}
Wenn Sie wissen müssen, welche Elemente geändert werden, sondern etwas mit ihnen nach haben sie in der Datenbank gespeichert sind, nur speichern die Entitäten, die in einem privaten Array geändert wurden, und dann ein onFlush-Ereignis definieren, das die Entitäten aus dem Array abruft.
BTW, diese Art von Ereignissen auslösen Sie die @ORM \ HasLifecycleCallbacks auf die Entität hinzufügen müssen.
Was versuchen Sie zu erreichen, wenn Sie feststellen, dass sich eine Entität geändert hat? –
Wenn Sie sich den Quelltext von 'UnitOfWork' anschauen, sagen sie in den Kommentaren von' isScheduledForUpdate' "Hinweis: Ist momentan nicht sehr nützlich, da schmutzige Entities nur zur Commit Zeit registriert werden" –
Nun ... Ich muss eine senden Benachrichtigung an einen Systembenutzer, wenn das Produkt geändert wird, aber ich sollte die Benachrichtigung ignorieren, wenn die Produktdaten nicht geändert werden (ich spüe trotzdem nach dem Binden der POST-Daten meines Formulars an die Entität, um diese Doctrine-Leichtigkeit zu verwenden). Ich werde versuchen, UnitOfWork :: computeChangeSets() vorher auszuführen, möglicherweise Leistung fallen lassen, aber kann arbeiten. – eagleoneraptor