1

我正在测试一个监听器以制作日志,但不知道如何获取新创建对象的 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。有人可以帮助我吗?非常感谢您。

4

3 回答 3

0

你需要监听一个不同的事件——postFlush或者postUpdate/ postRemove/postPersist

于 2012-10-08T13:47:36.647 回答
0

谢谢你的回答。

解决方案是:

    $objetos = $em->getRepository('miomioBundle:'.$className)->findAll();
    $last_item = end($objetos);
    $last_item = $last_item->getId() + 1; 
    $modificacion->setIdentificador($last_item);
于 2012-10-08T16:01:42.120 回答
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);
    }
}
于 2012-10-08T13:00:09.820 回答