LogEntryRepository.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. <?php
  2. namespace Gedmo\Loggable\Entity\Repository;
  3. use Doctrine\ORM\EntityRepository;
  4. use Gedmo\Loggable\AbstractLoggableListener as Loggable;
  5. /**
  6. * The LogEntryRepository has some useful functions
  7. * to interact with log entries.
  8. *
  9. * @author Gediminas Morkevicius <gediminas.morkevicius@gmail.com>
  10. * @package Gedmo\Loggable\Entity\Repository
  11. * @subpackage LogEntryRepository
  12. * @link http://www.gediminasm.org
  13. * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
  14. */
  15. class LogEntryRepository extends EntityRepository
  16. {
  17. /**
  18. * Loads all log entries for the
  19. * given $entity
  20. *
  21. * @param object $entity
  22. * @return array
  23. */
  24. public function getLogEntries($entity)
  25. {
  26. $objectClass = get_class($entity);
  27. $objectMeta = $this->_em->getClassMetadata($objectClass);
  28. $meta = $this->getClassMetadata();
  29. $dql = "SELECT log FROM {$meta->name} log";
  30. $dql .= " WHERE log.objectId = :objectId";
  31. $dql .= " AND log.objectClass = :objectClass";
  32. $dql .= " ORDER BY log.version DESC";
  33. $identifierField = $objectMeta->getSingleIdentifierFieldName();
  34. $objectId = $objectMeta->getReflectionProperty($identifierField)->getValue($entity);
  35. $q = $this->_em->createQuery($dql);
  36. $q->setParameters(compact('objectId', 'objectClass', 'order'));
  37. return $q->getResult();
  38. }
  39. /**
  40. * Reverts given $entity to $revision by
  41. * restoring all fields from that $revision.
  42. * After this operation you will need to
  43. * persist and flush the $entity.
  44. *
  45. * @param object $entity
  46. * @param integer $version
  47. * @throws \Gedmo\Exception\UnexpectedValueException
  48. * @return void
  49. */
  50. public function revert($entity, $version = 1)
  51. {
  52. $objectClass = get_class($entity);
  53. $objectMeta = $this->_em->getClassMetadata($objectClass);
  54. $meta = $this->getClassMetadata();
  55. $dql = "SELECT log FROM {$meta->name} log";
  56. $dql .= " WHERE log.objectId = :objectId";
  57. $dql .= " AND log.objectClass = :objectClass";
  58. $dql .= " AND log.version <= :version";
  59. $dql .= " ORDER BY log.version ASC";
  60. $identifierField = $objectMeta->getSingleIdentifierFieldName();
  61. $objectId = $objectMeta->getReflectionProperty($identifierField)->getValue($entity);
  62. $q = $this->_em->createQuery($dql);
  63. $q->setParameters(compact('objectId', 'objectClass', 'version'));
  64. $logs = $q->getResult();
  65. if ($logs) {
  66. $fields = $objectMeta->fieldNames;
  67. foreach ($objectMeta->associationMappings as $mapping) {
  68. if ($objectMeta->isSingleValuedAssociation($mapping['fieldName'])) {
  69. $fields[] = $mapping['fieldName'];
  70. }
  71. }
  72. unset($fields[$objectMeta->getSingleIdentifierFieldName()]);
  73. $filled = false;
  74. while (($log = array_pop($logs)) && !$filled) {
  75. if ($data = $log->getData()) {
  76. foreach ($data as $field => $value) {
  77. if (in_array($field, $fields)) {
  78. if ($objectMeta->isSingleValuedAssociation($field)) {
  79. $mapping = $objectMeta->getAssociationMapping($field);
  80. $value = $this->_em->getReference($mapping['targetEntity'], $value);
  81. }
  82. $objectMeta->getReflectionProperty($field)->setValue($entity, $value);
  83. unset($fields[array_search($field, $fields)]);
  84. }
  85. }
  86. }
  87. $filled = count($fields) === 0;
  88. }
  89. if (count($fields)) {
  90. throw new \Gedmo\Exception\UnexpectedValueException('Cound not fully revert the entity to version: '.$version);
  91. }
  92. } else {
  93. throw new \Gedmo\Exception\UnexpectedValueException('Count not find any log entries under version: '.$version);
  94. }
  95. }
  96. }