Вставка элемента в слушателя доктрины - PullRequest
3 голосов
/ 06 марта 2012

Я установил прослушиватель доктрины, который запускается при различных действиях с базой данных, создает объект журнала и вставляет его в базу данных.

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, время) ЗНАЧЕНИЯ (?,?,?,?,?)

Параметры: {}

Как я могу решить эту проблему?

ОБНОВЛЕНИЕ Вот моя новая тема, связанная с этим вопросом: LINK

1 Ответ

7 голосов
/ 06 марта 2012

Поскольку при вызове 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...