Symfony3将每个更新保存到数据库中

时间:2017-07-07 15:25:57

标签: php postgresql symfony

我是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();

}

我正在考虑使用表/列/数据创建一个对象/数组,如果一切正常,请在刷新之后调用全局函数将数据添加到更改表中。 这样做是否有简单的方法/良好做法?

1 个答案:

答案 0 :(得分:1)

首先,你不需要自己实现这个逻辑之王。 Doctrine在内部跟踪实体插入,更新,字段更改和删除,并创建您可以侦听的相应事件。例如,当您创建新的parameters实体并将其保留时,Doctrine会在您调用Info操作时调度prePersist事件。您可以创建事件订阅者来订阅此类事件并在那里执行您的逻辑。

要完全了解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它还支持版本控制。