需要记录原则的变化

时间:2012-10-08 12:46:07

标签: php symfony doctrine

我正在测试一个监听器来创建一个日志,但不知道如何获取新创建的对象的id。 我使用的方法如下:

class ListenerCrud{

protected $container;

public function __construct(ContainerInterface $container)
{
    $this->container = $container;
}

public function onFlush(onFlushEventArgs $eventArgs)
    {
            $em = $eventArgs->getEntityManager();
            $uow = $em->getUnitOfWork();

            foreach ($uow->getScheduledEntityInsertions() AS $entity) {
                if (!$entity instanceof Modificacion) {
                    $modificacion = new Modificacion();
                    $modificacion->setFechamod(new \DateTime('now'));
                    $className = join('', array_slice(explode('\\', get_class($entity)), -1));
                    $modificacion->setEntidad($className);
                    $modificacion->setTipo('Inserción');
                    $modificacion->setIdentificador($entity->getId()); //errorrrrrrrr
                    $securityContext = $this->container->get('security.context');
                    $modificacion->setEmpleado($securityContext->getToken()->getUser());
                    $modificacion->setInfo('');
                    $em->persist($modificacion);
                    $classMetadata = $em->getClassMetadata(get_class($modificacion));
                    $uow->computeChangeSet($classMetadata, $modificacion);
                    }
                 }
    }
}

我无法访问新创建的对象的id。 有人能帮助我吗?非常感谢你。

3 个答案:

答案 0 :(得分:0)

执行$em->persist($modificacion);后,您将数据保存到对象,但由于尚未分配,因此它仍然没有id。要将数据保存到数据库,您必须执行$em->flush();,之后对象将获得ID。

所以最直接的解决方案是:

foreach ($uow->getScheduledEntityInsertions() AS $entity) {
    if (!$entity instanceof Modificacion) {
        $modificacion = new Modificacion();
        $modificacion->setFechamod(new \DateTime('now'));
        $className = join('', array_slice(explode('\\', get_class($entity)), -1));
        $modificacion->setEntidad($className);
        $modificacion->setTipo('Inserción');
        $modificacion->setIdentificador($entity->getId()); //errorrrrrrrr
        $securityContext = $this->container->get('security.context');
        $modificacion->setEmpleado($securityContext->getToken()->getUser());
        $modificacion->setInfo('');
        $em->persist($modificacion);

        $em->flush(); // now you can doSmthWithId($modificacion->getId())

        $classMetadata = $em->getClassMetadata(get_class($modificacion));
        $uow->computeChangeSet($classMetadata, $modificacion);
    }
}

答案 1 :(得分:0)

您需要收听其他活动 - postFlushpostUpdate/postRemove/postPersist

答案 2 :(得分:0)

感谢您的回答。

解决方案是:

    $objetos = $em->getRepository('miomioBundle:'.$className)->findAll();
    $last_item = end($objetos);
    $last_item = $last_item->getId() + 1; 
    $modificacion->setIdentificador($last_item);