2017-07-07 2 views
1

Ich bin neu auf symfony speichern und postgreSQL und ich versuche ein Protokoll der Datenbank-Updates zu speichern/löscht Ive diese TabelleSymfony3 jedes Update in die Datenbank

CREATE TABLE "public"."changes" (
    "id" INT NOT NULL , 
    "id_user" INT NOT NULL, 
    "operation" VARCHAR(45) NOT NULL, 
    "table" VARCHAR(45) NOT NULL, 
    "column" VARCHAR(45) NOT NULL, 
    "old_data" TEXT NOT NULL, 
    "new_data" TEXT NOT NULL, 
    "ts" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY ("id"), 
    CONSTRAINT "user" 
    FOREIGN KEY ("id_user") 
    REFERENCES "public"."users" ("id") 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION); 

erstellt Und ich brauche, was ist jedes Mal in diese Tabelle speichern ich sumething wie

/** 
* @Route("/insert", name="insert") 
*/ 
public function insertAction(Request $request) 
{ 
    $em = $this->get('doctrine')->getManager(); 

    $info = new Info(); 
    $info->setMail($request->request->get('mail')); 
    $info->setName($request->request->get('name')); 
    $info->setLastname($request->request->get('lastname')); 

    $em->persist($info); 

    $em->flush(); 

} 

ich ist darüber nachzudenken, ein Objekt/Array mit der Tabelle/Spalte/Daten zu erstellen und nach der Spülung, wenn alles in Ordnung ist, rufen Sie eine globale Funktion hinzufügen die Daten in die Änderungstabelle. Gibt es einen einfachen Weg/gute Praxis, dies zu tun?

+0

können Sie es nicht tun, nur ein PostUpdate Listener? –

+0

wie? Ich habe eine Speicherprozedur in eine Datenbank geschrieben, aber ich muss dies auch aus Code machen, da ich den Benutzer, der die Änderung vornimmt, speichern muss. –

+1

Wir haben das mit Postgres '[LISTEN'] getan (https: // www .postgresql.org/docs/current/static/sql-listen.html) & ['NOTIFY'] (https://www.postgresql.org/docs/9.1/static/sql-notify.html) um die Protokollierung zu ermöglichen wird von [einem anderen Prozess] behandelt (http://www.pomm-project.org/news/using-postgresql-notify-in-5-minutes.html). – greg

Antwort

0

Zuerst müssen Sie diesen König der Logik nicht selbst implementieren. Doctrine verfolgt Entitätseinfügungen, Aktualisierungen, Feldänderungen und löscht intern und erstellt entsprechende Ereignisse, die Sie anhören können. Wenn Sie beispielsweise eine neue Info Entität erstellen und diese beibehalten, sendet Doctrine das Ereignis prePersist, wenn Sie die Operation flush aufrufen. Sie können Ereignis-Abonnenten erstellen, um solche Ereignisse zu abonnieren und Ihre Logik dort zu tun.

Um zu verstehen, voll Lebenszyklusereignisse Lehre Dokumentation offizielle Doktrin check out: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html

Ereignis Teilnehmer Erstellung der Dokumentation Symfony beschrieben: http://symfony.com/doc/current/doctrine/event_listeners_subscribers.html#creating-the-subscriber-class

Sie können auch versuchen, vorhandene Fremd Bündel, das Unternehmen Einfügungen protokolliert, , aktualisiert und löscht: https://github.com/simplethings/EntityAuditBundle Es unterstützt auch die Versionierung.

+0

Hallo, danke für deine Antwort. Ich habe viele Probleme bei der Umsetzung. Kannst du mir helfen? Ich habe einen Listener erstellt, wo ich die Entity und den EntityManager bekommen kann, aber wie kann ich damit arbeiten? –

+0

Hallo Vadim Ashikhman, danke für deine Antwort. Ich habe dir vorher noch nicht geantwortet, weil ich viel darüber recherchiert habe. Aber ich stecke fest. Was ich gemacht habe, ist ein Postupdate für Abonnenten mit zB Benutzer-/Rollentabellen. Aber hier ist meine erste Ausgabe. Nehmen wir an, ich möchte die Rolle des Benutzers ändern, wie kann ich die alte Rolle und die neue Rolle in meiner Änderungstabelle speichern? Wie kann ich wissen, welche Tabelle ich verwende, um zu sagen, oder welche Spalte hat sich geändert? –

+2

Hey! Rufen Sie im Ereignis 'preUpdate' die Methode 'getEntityChangeSet' für das Ereignisobjekt auf und Sie erhalten jedes geänderte Feld. Hier ist eine Dokumentation zum 'preUpdate' Event http://docs.doctrine-project.org/projects/doctrine-orm/de/latest/reference/events.html#preupdate –