Я настроил прослушиватель доктрины, который запускается в разных действиях базы данных и создает объект журнала и вставляет его в базу данных.
class FOO { // [...] public function onFlush(OnFlushEventArgs $args) { foreach ($args->getEntityManager()->getUnitOfWork()->getScheduledEntityUpdates() as $entity) { $this->createLog('edit', $entity); } } private function createLog($action, $entity) { if ($entity instanceof Log) { return; } $log = new Log; $log->setAction($action); $log->setTime(new \DateTime); $log->setForeignId($entity->getId()); $log->setUser($this->getUser()); $t = explode('\\', get_class($entity)); $entity_class = strtolower(end($t)); $log->setEntity($entity_class); $this->getEntityManager()->persist($log); } // [...] }
Когда я обновляю объект, я получаю следующую ошибку:
SQLSTATE [HY093]: недопустимый номер параметра: параметры не были связаны
В профилировщике я вижу этот запрос:
INSERT INTO vvg_logs (действие, сущность, foreign_id, user_id, время) VALUES (?,?,?,?,?)
Параметры: {}
Как я могу решить эту проблему?
UPDATE Вот моя новая тема, связанная с этим вопросом: LINK
Потому что, когда onFlush
, все изменения уже рассчитаны, и вам нужно обновить их, если вы измените свой объект или создадите новый объект.
$em = $this->getEntityManager(); $uow = $em->getUnitOfWork(); $logMetadata = $em->getClassMetadata('Your\LogClass'); ... $em->persist($log); $uow->computeChangeSet($logMetadata, $log);
Для postPersist:
$em = $this->getEntityManager(); $uow = $em->getUnitOfWork(); $log = new Log; ... $logMetadata = $em->getClassMetadata('Your\LogClass'); $className = $logMetadata->name; $persister = $this->getEntityPersister($className); $persister->addInsert($log); $uow->computeChangeSet($classMeta, $logEntry); $postInsertIds = $persister->executeInserts(); if ($postInsertIds) { foreach ($postInsertIds as $id => $entity) { $idField = $logMetadata->identifier[0]; $logMetadata->reflFields[$idField]->setValue($entity, $id); $this->addToIdentityMap($entity); } }