我正在测试一个监听器来创建一个日志,但不知道如何获取新创建的对象的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。 有人能帮助我吗?非常感谢你。
答案 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)
您需要收听其他活动 - postFlush
或postUpdate
/postRemove
/postPersist
。
答案 2 :(得分:0)
感谢您的回答。
解决方案是:
$objetos = $em->getRepository('miomioBundle:'.$className)->findAll();
$last_item = end($objetos);
$last_item = $last_item->getId() + 1;
$modificacion->setIdentificador($last_item);