Skip to content

Commit

Permalink
fix: Should fix ManagerRegistry::resetManager() (#95)
Browse files Browse the repository at this point in the history
* fix: Should fix `ManagerRegistry::resetManager()`

* remove isUninitializedObject
  • Loading branch information
priyadi authored Apr 19, 2024
1 parent a566811 commit 4c2a97a
Show file tree
Hide file tree
Showing 6 changed files with 90 additions and 10 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Changelog

## 2.3.3

* fix: Should fix `ManagerRegistry::resetManager()`

## 2.3.2

* chore: enable native_function_invocation in php-cs-fixer
Expand Down
3 changes: 2 additions & 1 deletion packages/domain-event/composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@
"symfony/dependency-injection": "^6.4 || ^7.0",
"symfony/event-dispatcher": "^6.4 || ^7.0",
"symfony/http-kernel": "^6.4 || ^7.0",
"symfony/service-contracts": "^3.0"
"symfony/service-contracts": "^3.0",
"symfony/var-exporter": "^6.4 || ^7.0"
},
"extra": {
"branch-alias": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
use Rekalogika\DomainEvent\Doctrine\DomainEventAwareEntityManager;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;

/**
* @internal
Expand All @@ -32,18 +33,22 @@ public function process(ContainerBuilder $container): void

/**
* @var string $name
* @var string $id
* @var string $serviceId
*/
foreach ($entityManagers as $name => $id) {
$service = $container->getDefinition($id);
$decoratedServiceId = $id . '.domain_event_aware';
foreach ($entityManagers as $name => $serviceId) {
$service = $container->getDefinition($serviceId);
$realServiceId = $serviceId . '.real';

$container->register($decoratedServiceId, DomainEventAwareEntityManager::class)
->setDecoratedService($id)
$container
->setDefinition($realServiceId, $service);

$container
->register($serviceId, DomainEventAwareEntityManager::class)
->setArguments([
'$wrapped' => $service,
'$wrapped' => new Reference($realServiceId),
'$eventDispatchers' => $eventDispatchers,
])
->setPublic(true)
->addTag('kernel.reset', ['method' => 'reset'])
->addTag('rekalogika.domain_event.entity_manager', ['name' => $name]);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,16 @@
use Rekalogika\DomainEvent\Exception\UndispatchedEventsException;
use Rekalogika\DomainEvent\Model\DomainEventStore;
use Rekalogika\DomainEvent\Model\TransactionAwareDomainEventStore;
use Symfony\Component\VarExporter\LazyObjectInterface;
use Symfony\Contracts\Service\ResetInterface;

/**
* Decorates entity manager so it dispatches domain events after flush.
*/
final class DomainEventAwareEntityManager extends EntityManagerDecorator implements
DomainEventAwareEntityManagerInterface,
ResetInterface
ResetInterface,
LazyObjectInterface
{
private bool $flushEnabled = true;
private bool $autodispatch = true;
Expand All @@ -56,6 +58,37 @@ public function __construct(
$this->postFlushDomainEvents = new TransactionAwareDomainEventStore();
}

public function isLazyObjectInitialized(bool $partial = false): bool
{
if ($this->wrapped instanceof LazyObjectInterface) {
return $this->wrapped->isLazyObjectInitialized($partial);
}

return true;
}

public function initializeLazyObject(): object
{
if ($this->wrapped instanceof LazyObjectInterface) {
$object = $this->wrapped->initializeLazyObject();

if ($object instanceof EntityManagerInterface) {
parent::__construct($object);
}
}

return $this;
}

public function resetLazyObject(): bool
{
if ($this->wrapped instanceof LazyObjectInterface) {
return $this->wrapped->resetLazyObject();
}

return false;
}

public function getObjectManager(): ObjectManager
{
return $this->wrapped;
Expand Down
10 changes: 9 additions & 1 deletion tests/Framework/Tests/DomainEventTestCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -63,11 +63,19 @@ public function setUp(): void
$this->entityManager = $entityManager;
}

public static function getEntityManager(): DomainEventAwareEntityManager
public static function getManagerRegistry(): ManagerRegistry
{
$managerRegistry = static::getContainer()->get(ManagerRegistry::class);
self::assertInstanceOf(ManagerRegistry::class, $managerRegistry);
self::assertInstanceOf(DomainEventAwareManagerRegistry::class, $managerRegistry);

return $managerRegistry;
}

public static function getEntityManager(): DomainEventAwareEntityManager
{
$managerRegistry = static::getManagerRegistry();

$entityManager = $managerRegistry->getManager();
self::assertInstanceOf(DomainEventAwareEntityManager::class, $entityManager);

Expand Down
29 changes: 29 additions & 0 deletions tests/Framework/Tests/ResetTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

declare(strict_types=1);

/*
* This file is part of rekalogika/domain-event-src package.
*
* (c) Priyadi Iman Nurcahyo <https://rekalogika.dev>
*
* For the full copyright and license information, please view the LICENSE file
* that was distributed with this source code.
*/

namespace Rekalogika\DomainEvent\Tests\Framework\Tests;

final class ResetTest extends DomainEventTestCase
{
public function testEntityManagerReset(): void
{
$entitymanager = static::getEntityManager();
$entitymanager->reset();
}

public function testManagerRegistryResetManager(): void
{
$managerRegistry = static::getManagerRegistry();
$managerRegistry->resetManager();
}
}

0 comments on commit 4c2a97a

Please sign in to comment.