Я новичок в symfony и postgreSQL, и я пытаюсь сохранить журнал обновлений / удалений базы данных. Я создал эту таблицу
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);
И мне нужно сохранять в эту таблицу каждый раз, когда я делаю что-то вроде
/** * @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(); }
Я думаю о создании объекта / массива с таблицей / столбцом / данными, а после флеша, если все в порядке, вызовите глобальную функцию, чтобы добавить данные в таблицу изменений. Есть ли простой способ / хорошая практика для этого?
Прежде всего, вам не нужно самостоятельно реализовать этого короля логики. Doctrine отслеживает вставки объектов, обновления, изменения полей и удаляет внутренне и создает соответствующие события, которые вы можете прослушать. Например, когда вы создаете новый объект Info
и сохраняете его, Doctrine отправляет событие prePersist
когда вы вызываете операцию flush
. Вы можете создать подписчика событий, чтобы подписаться на такие события и сделать свою логику там.
Чтобы полностью понять события жизненного цикла Doctrine, ознакомьтесь с официальной документацией доктрины: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html
Создание подписчика событий, описанное в документации Symfony: http://symfony.com/doc/current/doctrine/event_listeners_subscribers.html#creating-the-subscriber-class
Также вы можете попробовать существующий сторонний пакет, который будет вставлять сущности, обновлять и удалять сущности: https://github.com/simplethings/EntityAuditBundle. Он также поддерживает управление версиями.