Skip to content

Commit

Permalink
Merge pull request #27 from 21TORR/get-entity-changes
Browse files Browse the repository at this point in the history
Add `DoctrineChangeChecker::getEntityChanges()`
  • Loading branch information
apfelbox authored Nov 28, 2023
2 parents eefcfa1 + 3bbd79a commit 467148c
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 5 deletions.
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
2.5.0
=====

* (feature) Add `DoctrineChangeChecker::getEntityChanges()`.


2.4.1
=====

Expand Down
44 changes: 41 additions & 3 deletions src/Doctrine/DoctrineChangeChecker.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,38 @@
namespace Torr\Rad\Doctrine;

use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\PersistentCollection;
use Doctrine\Persistence\ManagerRegistry;
use Torr\Rad\Exception\Doctrine\InvalidDoctrineChangeCheckException;

final readonly class DoctrineChangeChecker
{
/**
*/
public function __construct (
private EntityManagerInterface $entityManager,
private ManagerRegistry $managerRegistry,
) {}


/**
* Determines whether any content in the entities (or the entities themselves)
* Determines whether any content globally in any of the entities (or the entities themselves)
* has changed. Only changing "timeModified" doesn't count as content change.
*
* @api
*/
public function hasContentChanged () : bool
{
$unitOfWork = $this->entityManager->getUnitOfWork();
$defaultEntityManager = $this->managerRegistry->getManager();

if (!$defaultEntityManager instanceof EntityManagerInterface)
{
throw new InvalidDoctrineChangeCheckException(\sprintf(
"Default manager is no entity manager, but '%s'",
\get_debug_type($defaultEntityManager),
));
}

$unitOfWork = $defaultEntityManager->getUnitOfWork();
$unitOfWork->computeChangeSets();

// If any entity was added / removed, something changed, so early exit
Expand Down Expand Up @@ -50,4 +63,29 @@ public function hasContentChanged () : bool

return false;
}


/**
* Returns the changes of the given entity
*
* @return array<string, array{mixed, mixed}|PersistentCollection>
*/
public function getEntityChanges (object $entity) : array
{
$entityClass = \get_class($entity);
$entityManager = $this->managerRegistry->getManagerForClass($entityClass);

if (!$entityManager instanceof EntityManagerInterface)
{
throw new InvalidDoctrineChangeCheckException(\sprintf(
"Could not fetch entity manager for entity of type '%s'",
$entityClass,
));
}

$unitOfWork = $entityManager->getUnitOfWork();
$unitOfWork->computeChangeSets();

return $unitOfWork->getEntityChangeSet($entity);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?php declare(strict_types=1);

namespace Torr\Rad\Exception\Doctrine;

use Torr\Rad\Exception\RadException;

final class InvalidDoctrineChangeCheckException extends \RuntimeException implements RadException
{
}
15 changes: 13 additions & 2 deletions tests/Doctrine/DoctrineChangeCheckerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\UnitOfWork;
use Doctrine\Persistence\ManagerRegistry;
use Torr\Rad\Doctrine\DoctrineChangeChecker;
use PHPUnit\Framework\TestCase;

Expand Down Expand Up @@ -83,7 +84,12 @@ public function testLargeEntityChanges (
->method("getUnitOfWork")
->willReturn($unitOfWork);

$checker = new DoctrineChangeChecker($entityManager);
$registry = $this->createMock(ManagerRegistry::class);
$registry
->method("getManager")
->willReturn($entityManager);

$checker = new DoctrineChangeChecker($registry);
self::assertSame($expected, $checker->hasContentChanged());
}

Expand Down Expand Up @@ -146,7 +152,12 @@ public function testChangesets (
->method("getUnitOfWork")
->willReturn($unitOfWork);

$checker = new DoctrineChangeChecker($entityManager);
$registry = $this->createMock(ManagerRegistry::class);
$registry
->method("getManager")
->willReturn($entityManager);

$checker = new DoctrineChangeChecker($registry);
self::assertSame($expected, $checker->hasContentChanged());
}
}

0 comments on commit 467148c

Please sign in to comment.