From 57ce6281b5d56711215200ec0a9aaa5d6500b5c3 Mon Sep 17 00:00:00 2001 From: Zayon Date: Mon, 10 Sep 2018 18:37:51 +0200 Subject: [PATCH 01/11] Allow multiple doctrine entity manager instances --- .../Persister/ObjectManagerPersister.php | 62 ++++++++++++------- .../Resources/config/doctrine_mongodb_odm.xml | 2 +- .../Symfony/Resources/config/doctrine_orm.xml | 2 +- .../Resources/config/doctrine_phpcr_odm.xml | 2 +- 4 files changed, 42 insertions(+), 26 deletions(-) diff --git a/src/Bridge/Doctrine/Persister/ObjectManagerPersister.php b/src/Bridge/Doctrine/Persister/ObjectManagerPersister.php index f8946c89..8ebd17d2 100644 --- a/src/Bridge/Doctrine/Persister/ObjectManagerPersister.php +++ b/src/Bridge/Doctrine/Persister/ObjectManagerPersister.php @@ -13,6 +13,7 @@ namespace Fidry\AliceDataFixtures\Bridge\Doctrine\Persister; +use Doctrine\Common\Persistence\ManagerRegistry; use Doctrine\Common\Persistence\Mapping\ClassMetadata; use Doctrine\Common\Persistence\ObjectManager; use Doctrine\ODM\MongoDB\Mapping\ClassMetadataInfo as ODMClassMetadataInfo; @@ -27,7 +28,8 @@ class ObjectManagerPersister implements PersisterInterface { use IsAServiceTrait; - private $objectManager; + /** @var array|ObjectManager[] */ + private $managers; /** * @var array|null Values are FQCN of persistable objects @@ -39,9 +41,9 @@ class ObjectManagerPersister implements PersisterInterface */ private $metadata = []; - public function __construct(ObjectManager $manager) + public function __construct(ManagerRegistry $managerRegistry) { - $this->objectManager = $manager; + $this->managers = $managerRegistry->getManagers(); } /** @@ -50,7 +52,7 @@ public function __construct(ObjectManager $manager) public function persist($object) { if (null === $this->persistableClasses) { - $this->persistableClasses = array_flip($this->getPersistableClasses($this->objectManager)); + $this->persistableClasses = array_flip($this->getPersistableClasses($this->managers)); } $class = get_class($object); @@ -77,14 +79,18 @@ public function persist($object) // Do nothing: not supported. } - try { - $this->objectManager->persist($object); - } catch (ORMException $exception) { - if ($metadata->idGenerator instanceof ORMAssignedGenerator) { - throw ObjectGeneratorPersisterExceptionFactory::createForEntityMissingAssignedIdForField($object); + foreach ($this->managers as $manager) { + if ($manager->contains($object)) { + try { + $manager->persist($object); + } catch (ORMException $exception) { + if ($metadata->idGenerator instanceof ORMAssignedGenerator) { + throw ObjectGeneratorPersisterExceptionFactory::createForEntityMissingAssignedIdForField($object); + } + + throw $exception; + } } - - throw $exception; } if (null !== $generator && false === $generator->isPostInsertGenerator()) { @@ -100,23 +106,30 @@ public function persist($object) */ public function flush() { - $this->objectManager->flush(); + foreach ($this->managers as $manager) { + $manager->flush(); + } } /** + * @param array|ObjectManager[] $managers + * * @return string[] */ - private function getPersistableClasses(ObjectManager $manager): array + private function getPersistableClasses(array $managers): array { $persistableClasses = []; - $allMetadata = $manager->getMetadataFactory()->getAllMetadata(); - - foreach ($allMetadata as $metadata) { - /** @var ORMClassMetadataInfo|ODMClassMetadataInfo $metadata */ - if (false === $metadata->isMappedSuperclass - && false === (isset($metadata->isEmbeddedClass) && $metadata->isEmbeddedClass) - ) { - $persistableClasses[] = $metadata->getName(); + + foreach ($managers as $manager) { + $allMetadata = $manager->getMetadataFactory()->getAllMetadata(); + + foreach ($allMetadata as $metadata) { + /** @var ORMClassMetadataInfo|ODMClassMetadataInfo $metadata */ + if (false === $metadata->isMappedSuperclass + && false === (isset($metadata->isEmbeddedClass) && $metadata->isEmbeddedClass) + ) { + $persistableClasses[] = $metadata->getName(); + } } } @@ -132,8 +145,11 @@ protected function configureIdGenerator(ORMClassMetadataInfo $metadata): void private function getMetadata(string $class): ClassMetadata { if (false === array_key_exists($class, $this->metadata)) { - $classMetadata = $this->objectManager->getClassMetadata($class); - $this->metadata[$class] = $classMetadata; + foreach ($this->managers as $manager) { + if ($manager->getMetadataFactory()->hasMetadataFor($class)) { + $this->metadata[$class] = $manager->getClassMetadata($class); + } + } } return $this->metadata[$class]; diff --git a/src/Bridge/Symfony/Resources/config/doctrine_mongodb_odm.xml b/src/Bridge/Symfony/Resources/config/doctrine_mongodb_odm.xml index 4068f490..4bbc02c0 100644 --- a/src/Bridge/Symfony/Resources/config/doctrine_mongodb_odm.xml +++ b/src/Bridge/Symfony/Resources/config/doctrine_mongodb_odm.xml @@ -71,7 +71,7 @@ - + diff --git a/src/Bridge/Symfony/Resources/config/doctrine_orm.xml b/src/Bridge/Symfony/Resources/config/doctrine_orm.xml index b2906397..7565f763 100644 --- a/src/Bridge/Symfony/Resources/config/doctrine_orm.xml +++ b/src/Bridge/Symfony/Resources/config/doctrine_orm.xml @@ -79,7 +79,7 @@ - + diff --git a/src/Bridge/Symfony/Resources/config/doctrine_phpcr_odm.xml b/src/Bridge/Symfony/Resources/config/doctrine_phpcr_odm.xml index 3b94e524..d51a5280 100644 --- a/src/Bridge/Symfony/Resources/config/doctrine_phpcr_odm.xml +++ b/src/Bridge/Symfony/Resources/config/doctrine_phpcr_odm.xml @@ -73,7 +73,7 @@ - + From 2216d974d0737dc7da270b2124c1f9650094544b Mon Sep 17 00:00:00 2001 From: Zayon Date: Wed, 12 Sep 2018 15:45:15 +0200 Subject: [PATCH 02/11] WIP --- .../Persister/ObjectManagerPersister.php | 74 +++++-------------- .../Resources/config/doctrine_mongodb_odm.xml | 3 +- .../Symfony/Resources/config/doctrine_orm.xml | 1 + .../Resources/config/doctrine_phpcr_odm.xml | 4 +- .../Persister/ObjectManagerPersisterTest.php | 14 +++- 5 files changed, 36 insertions(+), 60 deletions(-) diff --git a/src/Bridge/Doctrine/Persister/ObjectManagerPersister.php b/src/Bridge/Doctrine/Persister/ObjectManagerPersister.php index 8ebd17d2..87247527 100644 --- a/src/Bridge/Doctrine/Persister/ObjectManagerPersister.php +++ b/src/Bridge/Doctrine/Persister/ObjectManagerPersister.php @@ -28,13 +28,8 @@ class ObjectManagerPersister implements PersisterInterface { use IsAServiceTrait; - /** @var array|ObjectManager[] */ - private $managers; - - /** - * @var array|null Values are FQCN of persistable objects - */ - private $persistableClasses; + /** @var ManagerRegistry $managerRegistry */ + private $managerRegistry; /** * @var ClassMetadata[] Entity metadata, FQCN being the key @@ -43,7 +38,7 @@ class ObjectManagerPersister implements PersisterInterface public function __construct(ManagerRegistry $managerRegistry) { - $this->managers = $managerRegistry->getManagers(); + $this->managerRegistry = $managerRegistry; } /** @@ -51,14 +46,12 @@ public function __construct(ManagerRegistry $managerRegistry) */ public function persist($object) { - if (null === $this->persistableClasses) { - $this->persistableClasses = array_flip($this->getPersistableClasses($this->managers)); - } - $class = get_class($object); - if (isset($this->persistableClasses[$class])) { - $metadata = $this->getMetadata($class); + $manager = $this->managerRegistry->getManagerForClass($class); + + if ($manager) { + $metadata = $this->getClassMetadata($manager, $class); $generator = null; $generatorType = null; @@ -79,18 +72,14 @@ public function persist($object) // Do nothing: not supported. } - foreach ($this->managers as $manager) { - if ($manager->contains($object)) { - try { - $manager->persist($object); - } catch (ORMException $exception) { - if ($metadata->idGenerator instanceof ORMAssignedGenerator) { - throw ObjectGeneratorPersisterExceptionFactory::createForEntityMissingAssignedIdForField($object); - } - - throw $exception; - } + try { + $manager->persist($object); + } catch (ORMException $exception) { + if ($metadata->idGenerator instanceof ORMAssignedGenerator) { + throw ObjectGeneratorPersisterExceptionFactory::createForEntityMissingAssignedIdForField($object); } + + throw $exception; } if (null !== $generator && false === $generator->isPostInsertGenerator()) { @@ -106,50 +95,21 @@ public function persist($object) */ public function flush() { - foreach ($this->managers as $manager) { + foreach ($this->managerRegistry->getManagers() as $manager) { $manager->flush(); } } - /** - * @param array|ObjectManager[] $managers - * - * @return string[] - */ - private function getPersistableClasses(array $managers): array - { - $persistableClasses = []; - - foreach ($managers as $manager) { - $allMetadata = $manager->getMetadataFactory()->getAllMetadata(); - - foreach ($allMetadata as $metadata) { - /** @var ORMClassMetadataInfo|ODMClassMetadataInfo $metadata */ - if (false === $metadata->isMappedSuperclass - && false === (isset($metadata->isEmbeddedClass) && $metadata->isEmbeddedClass) - ) { - $persistableClasses[] = $metadata->getName(); - } - } - } - - return $persistableClasses; - } - protected function configureIdGenerator(ORMClassMetadataInfo $metadata): void { $metadata->setIdGeneratorType(ORMClassMetadataInfo::GENERATOR_TYPE_NONE); $metadata->setIdGenerator(new ORMAssignedGenerator()); } - private function getMetadata(string $class): ClassMetadata + private function getClassMetadata(ObjectManager $manager, string $class): ClassMetadata { if (false === array_key_exists($class, $this->metadata)) { - foreach ($this->managers as $manager) { - if ($manager->getMetadataFactory()->hasMetadataFor($class)) { - $this->metadata[$class] = $manager->getClassMetadata($class); - } - } + $this->metadata[$class] = $manager->getClassMetadata($class); } return $this->metadata[$class]; diff --git a/src/Bridge/Symfony/Resources/config/doctrine_mongodb_odm.xml b/src/Bridge/Symfony/Resources/config/doctrine_mongodb_odm.xml index 4bbc02c0..98a52b88 100644 --- a/src/Bridge/Symfony/Resources/config/doctrine_mongodb_odm.xml +++ b/src/Bridge/Symfony/Resources/config/doctrine_mongodb_odm.xml @@ -52,6 +52,7 @@ + @@ -71,7 +72,7 @@ - + diff --git a/src/Bridge/Symfony/Resources/config/doctrine_orm.xml b/src/Bridge/Symfony/Resources/config/doctrine_orm.xml index 7565f763..2289260a 100644 --- a/src/Bridge/Symfony/Resources/config/doctrine_orm.xml +++ b/src/Bridge/Symfony/Resources/config/doctrine_orm.xml @@ -52,6 +52,7 @@ + diff --git a/src/Bridge/Symfony/Resources/config/doctrine_phpcr_odm.xml b/src/Bridge/Symfony/Resources/config/doctrine_phpcr_odm.xml index d51a5280..bdec5296 100644 --- a/src/Bridge/Symfony/Resources/config/doctrine_phpcr_odm.xml +++ b/src/Bridge/Symfony/Resources/config/doctrine_phpcr_odm.xml @@ -52,12 +52,14 @@ + + The service "%service_id%s" is deprecated and will be removed in future versions. Use "fidry_alice_data_fixtures.persistence.doctrine_phpcr.purger.purger_factory" instead. @@ -73,7 +75,7 @@ - + diff --git a/tests/Bridge/Doctrine/Persister/ObjectManagerPersisterTest.php b/tests/Bridge/Doctrine/Persister/ObjectManagerPersisterTest.php index 5c0eef5c..8d0ebf41 100644 --- a/tests/Bridge/Doctrine/Persister/ObjectManagerPersisterTest.php +++ b/tests/Bridge/Doctrine/Persister/ObjectManagerPersisterTest.php @@ -14,6 +14,7 @@ namespace Fidry\AliceDataFixtures\Bridge\Doctrine\Persister; use Doctrine\Common\DataFixtures\Purger\ORMPurger; +use Doctrine\Common\Persistence\ManagerRegistry; use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\ORMException; use Doctrine\ORM\ORMInvalidArgumentException; @@ -25,6 +26,7 @@ use Fidry\AliceDataFixtures\Bridge\Doctrine\Entity\MappedSuperclassDummy; use Fidry\AliceDataFixtures\Exception\ObjectGeneratorPersisterException; use Fidry\AliceDataFixtures\Persistence\PersisterInterface; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use ReflectionClass; @@ -48,13 +50,23 @@ class ObjectManagerPersisterTest extends TestCase */ private $purger; + /** + * @var ManagerRegistry|MockObject + */ + private $managerRegistry; + /** * @inheritdoc */ public function setUp() { $this->entityManager = $GLOBALS['entity_manager']; - $this->persister = new ObjectManagerPersister($this->entityManager); + + $this->managerRegistry = $this->createMock(ManagerRegistry::class); + $this->managerRegistry->method('getManagerForClass')->willReturn($this->entityManager); + $this->managerRegistry->method('getManagers')->willReturn([$this->entityManager]); + + $this->persister = new ObjectManagerPersister($this->managerRegistry); $this->purger = new ORMPurger($this->entityManager); } From 6c3c04d2a6f5075266d01f0a985e71b2df890228 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20FIDRY?= Date: Wed, 24 Oct 2018 21:12:30 +0200 Subject: [PATCH 03/11] Add a persister and purger for Doctrine which operates on all known managers --- .../Persister/ManagerRegistryPersister.php | 85 +++++++++++ .../Persister/ObjectManagerPersister.php | 54 +++++-- .../Doctrine/Purger/ManagerRegistryPurger.php | 74 +++++++++ .../Doctrine/Purger/ObjectManagerPurger.php | 144 ++++++++++++++++++ src/Bridge/Doctrine/Purger/Purger.php | 127 ++------------- src/Persistence/PurgerInterface.php | 2 + 6 files changed, 358 insertions(+), 128 deletions(-) create mode 100644 src/Bridge/Doctrine/Persister/ManagerRegistryPersister.php create mode 100644 src/Bridge/Doctrine/Purger/ManagerRegistryPurger.php create mode 100644 src/Bridge/Doctrine/Purger/ObjectManagerPurger.php diff --git a/src/Bridge/Doctrine/Persister/ManagerRegistryPersister.php b/src/Bridge/Doctrine/Persister/ManagerRegistryPersister.php new file mode 100644 index 00000000..2f6a9a11 --- /dev/null +++ b/src/Bridge/Doctrine/Persister/ManagerRegistryPersister.php @@ -0,0 +1,85 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Fidry\AliceDataFixtures\Bridge\Doctrine\Persister; + +use Doctrine\Common\Persistence\ManagerRegistry; +use Fidry\AliceDataFixtures\Persistence\PersisterInterface; +use function get_class; +use function implode; +use InvalidArgumentException; +use Nelmio\Alice\IsAServiceTrait; +use function sprintf; + +/** + * @final + */ +class ManagerRegistryPersister implements PersisterInterface +{ + use IsAServiceTrait; + + private $registry; + + /** + * @var PersisterInterface[] + */ + private $persisters = []; + + public function __construct(ManagerRegistry $registry) + { + $this->registry = $registry; + + $managers = $registry->getManagers(); + + foreach ($managers as $manager) { + $this->persisters[get_class($manager)] = new ObjectManagerPersister($manager); + } + } + + /** + * @inheritdoc + */ + public function persist($object) + { + $persister = $this->getPersisterForClass(get_class($object)); + + $persister->persist($object); + } + + /** + * @inheritdoc + */ + public function flush() + { + foreach ($this->persisters as $persister) { + $persister->flush(); + } + } + + private function getPersisterForClass(string $class): PersisterInterface + { + $manager = $this->registry->getManagerForClass($class); + + if (null === $manager) { + throw new InvalidArgumentException( + sprintf( + 'Could not find a manager for the class "%s". Known managers: "%s"', + $class, + implode('", "', $this->registry->getManagerNames()) + ) + ); + } + + return $this->persisters[get_class($manager)]; + } +} diff --git a/src/Bridge/Doctrine/Persister/ObjectManagerPersister.php b/src/Bridge/Doctrine/Persister/ObjectManagerPersister.php index 87247527..7efa9627 100644 --- a/src/Bridge/Doctrine/Persister/ObjectManagerPersister.php +++ b/src/Bridge/Doctrine/Persister/ObjectManagerPersister.php @@ -13,7 +13,6 @@ namespace Fidry\AliceDataFixtures\Bridge\Doctrine\Persister; -use Doctrine\Common\Persistence\ManagerRegistry; use Doctrine\Common\Persistence\Mapping\ClassMetadata; use Doctrine\Common\Persistence\ObjectManager; use Doctrine\ODM\MongoDB\Mapping\ClassMetadataInfo as ODMClassMetadataInfo; @@ -24,21 +23,25 @@ use Fidry\AliceDataFixtures\Persistence\PersisterInterface; use Nelmio\Alice\IsAServiceTrait; -class ObjectManagerPersister implements PersisterInterface +/* final */ class ObjectManagerPersister implements PersisterInterface { use IsAServiceTrait; - /** @var ManagerRegistry $managerRegistry */ - private $managerRegistry; + private $objectManager; + + /** + * @var array|null Values are FQCN of persistable objects + */ + private $persistableClasses; /** * @var ClassMetadata[] Entity metadata, FQCN being the key */ private $metadata = []; - public function __construct(ManagerRegistry $managerRegistry) + public function __construct(ObjectManager $manager) { - $this->managerRegistry = $managerRegistry; + $this->objectManager = $manager; } /** @@ -46,12 +49,14 @@ public function __construct(ManagerRegistry $managerRegistry) */ public function persist($object) { - $class = get_class($object); + if (null === $this->persistableClasses) { + $this->persistableClasses = array_flip($this->getPersistableClasses($this->objectManager)); + } - $manager = $this->managerRegistry->getManagerForClass($class); + $class = get_class($object); - if ($manager) { - $metadata = $this->getClassMetadata($manager, $class); + if (isset($this->persistableClasses[$class])) { + $metadata = $this->getMetadata($class); $generator = null; $generatorType = null; @@ -73,7 +78,7 @@ public function persist($object) } try { - $manager->persist($object); + $this->objectManager->persist($object); } catch (ORMException $exception) { if ($metadata->idGenerator instanceof ORMAssignedGenerator) { throw ObjectGeneratorPersisterExceptionFactory::createForEntityMissingAssignedIdForField($object); @@ -95,9 +100,27 @@ public function persist($object) */ public function flush() { - foreach ($this->managerRegistry->getManagers() as $manager) { - $manager->flush(); + $this->objectManager->flush(); + } + + /** + * @return string[] + */ + private function getPersistableClasses(ObjectManager $manager): array + { + $persistableClasses = []; + $allMetadata = $manager->getMetadataFactory()->getAllMetadata(); + + foreach ($allMetadata as $metadata) { + /** @var ORMClassMetadataInfo|ODMClassMetadataInfo $metadata */ + if (false === $metadata->isMappedSuperclass + && false === (isset($metadata->isEmbeddedClass) && $metadata->isEmbeddedClass) + ) { + $persistableClasses[] = $metadata->getName(); + } } + + return $persistableClasses; } protected function configureIdGenerator(ORMClassMetadataInfo $metadata): void @@ -106,10 +129,11 @@ protected function configureIdGenerator(ORMClassMetadataInfo $metadata): void $metadata->setIdGenerator(new ORMAssignedGenerator()); } - private function getClassMetadata(ObjectManager $manager, string $class): ClassMetadata + private function getMetadata(string $class): ClassMetadata { if (false === array_key_exists($class, $this->metadata)) { - $this->metadata[$class] = $manager->getClassMetadata($class); + $classMetadata = $this->objectManager->getClassMetadata($class); + $this->metadata[$class] = $classMetadata; } return $this->metadata[$class]; diff --git a/src/Bridge/Doctrine/Purger/ManagerRegistryPurger.php b/src/Bridge/Doctrine/Purger/ManagerRegistryPurger.php new file mode 100644 index 00000000..6c840f68 --- /dev/null +++ b/src/Bridge/Doctrine/Purger/ManagerRegistryPurger.php @@ -0,0 +1,74 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Fidry\AliceDataFixtures\Bridge\Doctrine\Persister; + +use function array_map; +use Doctrine\Common\Persistence\ManagerRegistry; +use Doctrine\Common\Persistence\ObjectManager; +use Fidry\AliceDataFixtures\Bridge\Doctrine\Purger\ObjectManagerPurger; +use Fidry\AliceDataFixtures\Persistence\PurgeMode; +use Fidry\AliceDataFixtures\Persistence\PurgerFactoryInterface; +use Fidry\AliceDataFixtures\Persistence\PurgerInterface; +use InvalidArgumentException; +use Nelmio\Alice\IsAServiceTrait; + +/** + * @final + */ +/* final */ class ManagerRegistryPurger implements PurgerInterface, PurgerFactoryInterface +{ + use IsAServiceTrait; + + private $registry; + private $purgeMode; + + /** + * @var PurgerInterface[] + */ + private $purgers = []; + + public function __construct(ManagerRegistry $registry, PurgeMode $purgeMode = null) + { + $this->registry = $registry; + + $this->purgers = array_map( + function (ObjectManager $manager) use ($purgeMode): PurgerInterface { + return new ObjectManagerPurger($manager, $purgeMode); + }, + $registry->getManagers() + ); + } + + /** + * @inheritdoc + */ + public function create(PurgeMode $mode, PurgerInterface $purger = null): PurgerInterface + { + if (null !== $purger) { + throw new InvalidArgumentException('Cannot create a new purger from an existing one.'); + } + + return new self($this->registry, $mode); + } + + /** + * @inheritdoc + */ + public function purge(): void + { + foreach ($this->purgers as $purger) { + $purger->purge(); + } + } +} diff --git a/src/Bridge/Doctrine/Purger/ObjectManagerPurger.php b/src/Bridge/Doctrine/Purger/ObjectManagerPurger.php new file mode 100644 index 00000000..13075bc5 --- /dev/null +++ b/src/Bridge/Doctrine/Purger/ObjectManagerPurger.php @@ -0,0 +1,144 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Fidry\AliceDataFixtures\Bridge\Doctrine\Purger; + +use Doctrine\Common\DataFixtures\Purger\MongoDBPurger as DoctrineMongoDBPurger; +use Doctrine\Common\DataFixtures\Purger\ORMPurger as DoctrineOrmPurger; +use Doctrine\Common\DataFixtures\Purger\PHPCRPurger as DoctrinePhpCrPurger; +use Doctrine\Common\DataFixtures\Purger\PurgerInterface as DoctrinePurgerInterface; +use Doctrine\Common\Persistence\ObjectManager; +use Doctrine\DBAL\Driver\AbstractMySQLDriver; +use Doctrine\ODM\MongoDB\DocumentManager as DoctrineMongoDocumentManager; +use Doctrine\ODM\PHPCR\DocumentManager as DoctrinePhpCrDocumentManager; +use Doctrine\ORM\EntityManagerInterface; +use Fidry\AliceDataFixtures\Persistence\PurgeMode; +use Fidry\AliceDataFixtures\Persistence\PurgerFactoryInterface; +use Fidry\AliceDataFixtures\Persistence\PurgerInterface; +use InvalidArgumentException; +use Nelmio\Alice\IsAServiceTrait; + +/** + * Bridge for Doctrine purger. + * + * @author Vincent CHALAMON + * @final + */ +/* final */ class ObjectManagerPurger implements PurgerInterface, PurgerFactoryInterface +{ + use IsAServiceTrait; + + private $manager; + private $purgeMode; + private $purger; + + public function __construct(ObjectManager $manager, PurgeMode $purgeMode = null) + { + $this->manager = $manager; + $this->purgeMode = $purgeMode; + + $this->purger = static::createPurger($manager, $purgeMode); + } + + /** + * @inheritdoc + */ + public function create(PurgeMode $mode, PurgerInterface $purger = null): PurgerInterface + { + if (null === $purger) { + return new self($this->manager, $mode); + } + + if ($purger instanceof DoctrinePurgerInterface) { + $manager = $purger->getObjectManager(); + } elseif ($purger instanceof self) { + $manager = $purger->manager; + } else { + throw new InvalidArgumentException( + sprintf( + 'Expected purger to be either and instance of "%s" or "%s". Got "%s".', + DoctrinePurgerInterface::class, + __CLASS__, + get_class($purger) + ) + ); + } + + if (null === $manager) { + throw new InvalidArgumentException( + sprintf( + 'Expected purger "%s" to have an object manager, got "null" instead.', + get_class($purger) + ) + ); + } + + return new self($manager, $mode); + } + + /** + * @inheritdoc + */ + public function purge(): void + { + // Because MySQL rocks, you got to disable foreign key checks when doing a TRUNCATE unlike in for example + // PostgreSQL. This ideally should be done in the Purger of doctrine/data-fixtures but meanwhile we are doing + // it here. + // See the progress in https://github.com/doctrine/data-fixtures/pull/272 + $truncateOrm = ( + $this->purger instanceof DoctrineOrmPurger + && PurgeMode::createTruncateMode()->getValue() === $this->purgeMode->getValue() + && $this->purger->getObjectManager()->getConnection()->getDriver() instanceof AbstractMySQLDriver + ); + + if ($truncateOrm) { + $connection = $this->purger->getObjectManager()->getConnection(); + + $connection->exec('SET FOREIGN_KEY_CHECKS = 0;'); + } + + $this->purger->purge(); + + if ($truncateOrm && isset($connection)) { + $connection->exec('SET FOREIGN_KEY_CHECKS = 1;'); + } + } + + private static function createPurger(ObjectManager $manager, ?PurgeMode $purgeMode): DoctrinePurgerInterface + { + if ($manager instanceof EntityManagerInterface) { + $purger = new DoctrineOrmPurger($manager); + + if (null !== $purgeMode) { + $purger->setPurgeMode($purgeMode->getValue()); + } + + return $purger; + } + + if ($manager instanceof DoctrinePhpCrDocumentManager) { + return new DoctrinePhpCrPurger($manager); + } + + if ($manager instanceof DoctrineMongoDocumentManager) { + return new DoctrineMongoDBPurger($manager); + } + + throw new InvalidArgumentException( + sprintf( + 'Cannot create a purger for ObjectManager of class %s', + get_class($manager) + ) + ); + } +} diff --git a/src/Bridge/Doctrine/Purger/Purger.php b/src/Bridge/Doctrine/Purger/Purger.php index da53aed7..dd5ef975 100644 --- a/src/Bridge/Doctrine/Purger/Purger.php +++ b/src/Bridge/Doctrine/Purger/Purger.php @@ -13,132 +13,33 @@ namespace Fidry\AliceDataFixtures\Bridge\Doctrine\Purger; -use Doctrine\Common\DataFixtures\Purger\MongoDBPurger as DoctrineMongoDBPurger; -use Doctrine\Common\DataFixtures\Purger\ORMPurger as DoctrineOrmPurger; -use Doctrine\Common\DataFixtures\Purger\PHPCRPurger as DoctrinePhpCrPurger; -use Doctrine\Common\DataFixtures\Purger\PurgerInterface as DoctrinePurgerInterface; use Doctrine\Common\Persistence\ObjectManager; -use Doctrine\DBAL\Driver\AbstractMySQLDriver; -use Doctrine\ODM\MongoDB\DocumentManager as DoctrineMongoDocumentManager; -use Doctrine\ODM\PHPCR\DocumentManager as DoctrinePhpCrDocumentManager; -use Doctrine\ORM\EntityManagerInterface; +use const E_USER_DEPRECATED; use Fidry\AliceDataFixtures\Persistence\PurgeMode; -use Fidry\AliceDataFixtures\Persistence\PurgerFactoryInterface; -use Fidry\AliceDataFixtures\Persistence\PurgerInterface; -use InvalidArgumentException; -use Nelmio\Alice\IsAServiceTrait; +use function trigger_error; /** - * Bridge for Doctrine purger. + * @deprecated Use ObjectManagerPurger instead * - * @author Vincent CHALAMON - * @final + * @see ObjectManagerPurger */ -/* final */ class Purger implements PurgerInterface, PurgerFactoryInterface +/* final */ class Purger extends ObjectManagerPurger { - use IsAServiceTrait; - - private $manager; - private $purgeMode; - private $purger; - - public function __construct(ObjectManager $manager, PurgeMode $purgeMode = null) - { - $this->manager = $manager; - $this->purgeMode = $purgeMode; - - $this->purger = static::createPurger($manager, $purgeMode); - } - - /** - * @inheritdoc - */ - public function create(PurgeMode $mode, PurgerInterface $purger = null): PurgerInterface - { - if (null === $purger) { - return new self($this->manager, $mode); - } - - if ($purger instanceof DoctrinePurgerInterface) { - $manager = $purger->getObjectManager(); - } elseif ($purger instanceof self) { - $manager = $purger->manager; - } else { - throw new InvalidArgumentException( - sprintf( - 'Expected purger to be either and instance of "%s" or "%s". Got "%s".', - DoctrinePurgerInterface::class, - __CLASS__, - get_class($purger) - ) - ); - } - - if (null === $manager) { - throw new InvalidArgumentException( - sprintf( - 'Expected purger "%s" to have an object manager, got "null" instead.', - get_class($purger) - ) - ); - } - - return new self($manager, $mode); - } - /** * @inheritdoc */ - public function purge() + public function __construct(ObjectManager $manager, PurgeMode $purgeMode = null) { - // Because MySQL rocks, you got to disable foreign key checks when doing a TRUNCATE unlike in for example - // PostgreSQL. This ideally should be done in the Purger of doctrine/data-fixtures but meanwhile we are doing - // it here. - // See the progress in https://github.com/doctrine/data-fixtures/pull/272 - $truncateOrm = ( - $this->purger instanceof DoctrineOrmPurger - && PurgeMode::createTruncateMode()->getValue() === $this->purgeMode->getValue() - && $this->purger->getObjectManager()->getConnection()->getDriver() instanceof AbstractMySQLDriver + @trigger_error( + sprintf( + '"%s" has been deprecated since v1.2.0. Use "%s" instead.', + self::class, + ObjectManagerPurger::class + ), + E_USER_DEPRECATED ); - if ($truncateOrm) { - $connection = $this->purger->getObjectManager()->getConnection(); - - $connection->exec('SET FOREIGN_KEY_CHECKS = 0;'); - } - - $this->purger->purge(); - - if ($truncateOrm && isset($connection)) { - $connection->exec('SET FOREIGN_KEY_CHECKS = 1;'); - } + parent::__construct($manager, $purgeMode); } - private static function createPurger(ObjectManager $manager, ?PurgeMode $purgeMode): DoctrinePurgerInterface - { - if ($manager instanceof EntityManagerInterface) { - $purger = new DoctrineOrmPurger($manager); - - if (null !== $purgeMode) { - $purger->setPurgeMode($purgeMode->getValue()); - } - - return $purger; - } - - if ($manager instanceof DoctrinePhpCrDocumentManager) { - return new DoctrinePhpCrPurger($manager); - } - - if ($manager instanceof DoctrineMongoDocumentManager) { - return new DoctrineMongoDBPurger($manager); - } - - throw new InvalidArgumentException( - sprintf( - 'Cannot create a purger for ObjectManager of class %s', - get_class($manager) - ) - ); - } } diff --git a/src/Persistence/PurgerInterface.php b/src/Persistence/PurgerInterface.php index bfe67204..c286633b 100644 --- a/src/Persistence/PurgerInterface.php +++ b/src/Persistence/PurgerInterface.php @@ -34,6 +34,8 @@ interface PurgerInterface /** * Purges the database before loading. Depending of the implementation, the purge may truncate the database or * remove only a part of the database data. + * + * @return void The typehint is gonna be enforced from 2.0.0 onwards */ public function purge(); } From 7564d02777b59e9aca9da90b3829494757723aaa Mon Sep 17 00:00:00 2001 From: Julien Deniau Date: Thu, 27 Dec 2018 14:02:29 +0100 Subject: [PATCH 04/11] Fix some issues with multiple entity manager --- .../Persister/ManagerRegistryPersister.php | 8 ++++---- .../Persister/ObjectManagerPersister.php | 18 +++++++++--------- .../Symfony/Resources/config/doctrine_orm.xml | 2 +- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/Bridge/Doctrine/Persister/ManagerRegistryPersister.php b/src/Bridge/Doctrine/Persister/ManagerRegistryPersister.php index 2f6a9a11..7fcbee7d 100644 --- a/src/Bridge/Doctrine/Persister/ManagerRegistryPersister.php +++ b/src/Bridge/Doctrine/Persister/ManagerRegistryPersister.php @@ -42,12 +42,12 @@ public function __construct(ManagerRegistry $registry) $managers = $registry->getManagers(); foreach ($managers as $manager) { - $this->persisters[get_class($manager)] = new ObjectManagerPersister($manager); + $this->persisters[spl_object_hash($manager)] = new ObjectManagerPersister($manager); } } /** - * @inheritdoc + * {@inheritdoc} */ public function persist($object) { @@ -57,7 +57,7 @@ public function persist($object) } /** - * @inheritdoc + * {@inheritdoc} */ public function flush() { @@ -80,6 +80,6 @@ private function getPersisterForClass(string $class): PersisterInterface ); } - return $this->persisters[get_class($manager)]; + return $this->persisters[spl_object_hash($manager)]; } } diff --git a/src/Bridge/Doctrine/Persister/ObjectManagerPersister.php b/src/Bridge/Doctrine/Persister/ObjectManagerPersister.php index 7efa9627..2c2c4856 100644 --- a/src/Bridge/Doctrine/Persister/ObjectManagerPersister.php +++ b/src/Bridge/Doctrine/Persister/ObjectManagerPersister.php @@ -45,7 +45,7 @@ public function __construct(ObjectManager $manager) } /** - * @inheritdoc + * {@inheritdoc} */ public function persist($object) { @@ -87,7 +87,7 @@ public function persist($object) throw $exception; } - if (null !== $generator && false === $generator->isPostInsertGenerator()) { + if (null !== $generator/* && false === $generator->isPostInsertGenerator()*/) { // Restore the generator if has been temporary unset $metadata->setIdGeneratorType($generatorType); $metadata->setIdGenerator($generator); @@ -96,13 +96,19 @@ public function persist($object) } /** - * @inheritdoc + * {@inheritdoc} */ public function flush() { $this->objectManager->flush(); } + protected function configureIdGenerator(ORMClassMetadataInfo $metadata): void + { + $metadata->setIdGeneratorType(ORMClassMetadataInfo::GENERATOR_TYPE_NONE); + $metadata->setIdGenerator(new ORMAssignedGenerator()); + } + /** * @return string[] */ @@ -123,12 +129,6 @@ private function getPersistableClasses(ObjectManager $manager): array return $persistableClasses; } - protected function configureIdGenerator(ORMClassMetadataInfo $metadata): void - { - $metadata->setIdGeneratorType(ORMClassMetadataInfo::GENERATOR_TYPE_NONE); - $metadata->setIdGenerator(new ORMAssignedGenerator()); - } - private function getMetadata(string $class): ClassMetadata { if (false === array_key_exists($class, $this->metadata)) { diff --git a/src/Bridge/Symfony/Resources/config/doctrine_orm.xml b/src/Bridge/Symfony/Resources/config/doctrine_orm.xml index 2289260a..5302cb73 100644 --- a/src/Bridge/Symfony/Resources/config/doctrine_orm.xml +++ b/src/Bridge/Symfony/Resources/config/doctrine_orm.xml @@ -78,7 +78,7 @@ public="true" /> From b6a8ab70b80b4d58844a1fd3afe78d3071b08617 Mon Sep 17 00:00:00 2001 From: Julien Deniau Date: Fri, 31 Jul 2020 11:29:17 +0200 Subject: [PATCH 05/11] change version number in deprecation --- src/Bridge/Doctrine/Purger/Purger.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Bridge/Doctrine/Purger/Purger.php b/src/Bridge/Doctrine/Purger/Purger.php index 67c50ded..2a00be79 100644 --- a/src/Bridge/Doctrine/Purger/Purger.php +++ b/src/Bridge/Doctrine/Purger/Purger.php @@ -31,7 +31,7 @@ public function __construct(ObjectManager $manager, PurgeMode $purgeMode = null) { @trigger_error( sprintf( - '"%s" has been deprecated since v1.2.0. Use "%s" instead.', + '"%s" has been deprecated since v1.3.0. Use "%s" instead.', self::class, ObjectManagerPurger::class ), From 9502a66ef5598d0ae3a78939b9c6a61f1d58d947 Mon Sep 17 00:00:00 2001 From: Julien Deniau Date: Wed, 26 Aug 2020 15:03:33 +0200 Subject: [PATCH 06/11] try to fix tests --- src/Bridge/Symfony/Resources/config/doctrine_mongodb_odm.xml | 2 +- src/Bridge/Symfony/Resources/config/doctrine_phpcr_odm.xml | 2 +- .../Bridge/Doctrine/Persister/ObjectManagerPersisterTest.php | 4 +++- .../Symfony/Doctrine/FidryAliceDataFixturesBundleTest.php | 2 +- .../Doctrine/FidryAliceDataFixturesBundleTest.php | 4 ++-- 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/Bridge/Symfony/Resources/config/doctrine_mongodb_odm.xml b/src/Bridge/Symfony/Resources/config/doctrine_mongodb_odm.xml index d2ccb3c1..b3e40bdd 100644 --- a/src/Bridge/Symfony/Resources/config/doctrine_mongodb_odm.xml +++ b/src/Bridge/Symfony/Resources/config/doctrine_mongodb_odm.xml @@ -68,7 +68,7 @@ public="true" /> diff --git a/src/Bridge/Symfony/Resources/config/doctrine_phpcr_odm.xml b/src/Bridge/Symfony/Resources/config/doctrine_phpcr_odm.xml index bf285535..4f3ec1b5 100644 --- a/src/Bridge/Symfony/Resources/config/doctrine_phpcr_odm.xml +++ b/src/Bridge/Symfony/Resources/config/doctrine_phpcr_odm.xml @@ -72,7 +72,7 @@ public="true" /> diff --git a/tests/Bridge/Doctrine/Persister/ObjectManagerPersisterTest.php b/tests/Bridge/Doctrine/Persister/ObjectManagerPersisterTest.php index 52e55f84..57c12a1e 100644 --- a/tests/Bridge/Doctrine/Persister/ObjectManagerPersisterTest.php +++ b/tests/Bridge/Doctrine/Persister/ObjectManagerPersisterTest.php @@ -66,7 +66,7 @@ public function setUp(): void $this->managerRegistry->method('getManagerForClass')->willReturn($this->entityManager); $this->managerRegistry->method('getManagers')->willReturn([$this->entityManager]); - $this->persister = new ObjectManagerPersister($this->managerRegistry); + $this->persister = new ManagerRegistryPersister($this->managerRegistry); $this->purger = new ORMPurger($this->entityManager); } @@ -81,11 +81,13 @@ public function tearDown(): void public function testIsAPersister() { $this->assertTrue(is_a(ObjectManagerPersister::class, PersisterInterface::class, true)); + $this->assertTrue(is_a(ManagerRegistryPersister::class, PersisterInterface::class, true)); } public function testIsNotClonable() { $this->assertFalse((new ReflectionClass(ObjectManagerPersister::class))->isCloneable()); + $this->assertFalse((new ReflectionClass(ManagerRegistryPersister::class))->isCloneable()); } /** diff --git a/tests/Bridge/Symfony/Doctrine/FidryAliceDataFixturesBundleTest.php b/tests/Bridge/Symfony/Doctrine/FidryAliceDataFixturesBundleTest.php index ba3b5cdb..55e657e3 100644 --- a/tests/Bridge/Symfony/Doctrine/FidryAliceDataFixturesBundleTest.php +++ b/tests/Bridge/Symfony/Doctrine/FidryAliceDataFixturesBundleTest.php @@ -60,7 +60,7 @@ public function testServiceRegistration() ); $this->assertServiceIsInstanceOf( - \Fidry\AliceDataFixtures\Bridge\Doctrine\Persister\ObjectManagerPersister::class, + \Fidry\AliceDataFixtures\Bridge\Doctrine\Persister\ManagerRegistryPersister::class, 'fidry_alice_data_fixtures.persistence.persister.doctrine.object_manager_persister' ); diff --git a/tests/Bridge/Symfony/ProxyManager/Doctrine/FidryAliceDataFixturesBundleTest.php b/tests/Bridge/Symfony/ProxyManager/Doctrine/FidryAliceDataFixturesBundleTest.php index 1e88c331..ec007745 100644 --- a/tests/Bridge/Symfony/ProxyManager/Doctrine/FidryAliceDataFixturesBundleTest.php +++ b/tests/Bridge/Symfony/ProxyManager/Doctrine/FidryAliceDataFixturesBundleTest.php @@ -13,7 +13,7 @@ namespace Fidry\AliceDataFixtures\Bridge\Symfony\ProxyManager\Doctrine; -use Fidry\AliceDataFixtures\Bridge\Doctrine\Persister\ObjectManagerPersister; +use Fidry\AliceDataFixtures\Bridge\Doctrine\Persister\ManagerRegistryPersister; use Fidry\AliceDataFixtures\Bridge\Doctrine\Purger\Purger; use Fidry\AliceDataFixtures\Bridge\Symfony\FidryAliceDataFixturesBundleTest as NakedFidryAliceDataFixturesBundleTest; use Fidry\AliceDataFixtures\Bridge\Symfony\SymfonyApp\DoctrineKernel; @@ -62,7 +62,7 @@ public function testServiceRegistration() ); $this->assertInstanceOf( - ObjectManagerPersister::class, + ManagerRegistryPersister::class, $this->kernel->getContainer()->get('fidry_alice_data_fixtures.persistence.persister.doctrine.object_manager_persister') ); From c1fd2e11fb74381c45c9160bd401f5ef83f46931 Mon Sep 17 00:00:00 2001 From: Julien Deniau Date: Fri, 28 Aug 2020 13:53:01 +0200 Subject: [PATCH 07/11] try replacing Purger by ObjectManagerPurger --- tests/Bridge/Doctrine/Purger/PurgerTest.php | 8 ++++---- tests/Bridge/DoctrineMongoDB/Purger/PurgerTest.php | 6 +++--- tests/Bridge/DoctrinePhpCr/Purger/PurgerTest.php | 5 +++-- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/tests/Bridge/Doctrine/Purger/PurgerTest.php b/tests/Bridge/Doctrine/Purger/PurgerTest.php index ff8e0fcb..2399eb41 100644 --- a/tests/Bridge/Doctrine/Purger/PurgerTest.php +++ b/tests/Bridge/Doctrine/Purger/PurgerTest.php @@ -14,8 +14,8 @@ namespace Fidry\AliceDataFixtures\Bridge\Doctrine\Purger; use Doctrine\Common\DataFixtures\Purger\ORMPurger as DoctrineOrmPurger; -use Doctrine\DBAL\Driver\AbstractMySQLDriver; use Doctrine\DBAL\Connection; +use Doctrine\DBAL\Driver\AbstractMySQLDriver; use Doctrine\ORM\EntityManager; use Fidry\AliceDataFixtures\Bridge\Doctrine\Entity\Dummy; use Fidry\AliceDataFixtures\Bridge\Doctrine\ORM\FakeEntityManager; @@ -49,7 +49,7 @@ public function testCreatesADoctrineOrmPurgerWithTheAppropriateManagerAndPurgeMo { $manager = new FakeEntityManager(); $purgeMode = PurgeMode::createTruncateMode(); - $purger = new Purger($manager, $purgeMode); + $purger = new ObjectManagerPurger($manager, $purgeMode); $decoratedPurgerReflection = (new \ReflectionObject($purger))->getProperty('purger'); $decoratedPurgerReflection->setAccessible(true); @@ -76,7 +76,7 @@ public function testDisableFKChecksOnDeleteIsPerformed() $purgerORM->purge()->shouldBeCalled(); $purgeMode = PurgeMode::createDeleteMode(); - $purger = new Purger($manager->reveal(), $purgeMode); + $purger = new ObjectManagerPurger($manager->reveal(), $purgeMode); $decoratedPurgerReflection = (new \ReflectionObject($purger))->getProperty('purger'); $decoratedPurgerReflection->setAccessible(true); @@ -96,7 +96,7 @@ public function testEmptyDatabase() $this->assertEquals(1, count($manager->getRepository(Dummy::class)->findAll())); - $purger = new Purger($manager, PurgeMode::createDeleteMode()); + $purger = new ObjectManagerPurger($manager, PurgeMode::createDeleteMode()); $purger->purge(); $this->assertEquals(0, count($manager->getRepository(Dummy::class)->findAll())); diff --git a/tests/Bridge/DoctrineMongoDB/Purger/PurgerTest.php b/tests/Bridge/DoctrineMongoDB/Purger/PurgerTest.php index 1c326190..a8fcc245 100644 --- a/tests/Bridge/DoctrineMongoDB/Purger/PurgerTest.php +++ b/tests/Bridge/DoctrineMongoDB/Purger/PurgerTest.php @@ -16,7 +16,7 @@ use Doctrine\Common\DataFixtures\Purger\MongoDBPurger; use Doctrine\ODM\MongoDB\DocumentManager; use Fidry\AliceDataFixtures\Bridge\Doctrine\MongoDocument\Dummy; -use Fidry\AliceDataFixtures\Bridge\Doctrine\Purger\Purger; +use Fidry\AliceDataFixtures\Bridge\Doctrine\Purger\ObjectManagerPurger; use PHPUnit\Framework\TestCase; /** @@ -29,7 +29,7 @@ class PurgerTest extends TestCase public function testCreatesADoctrineOdmPurgerWithTheAppropriateManager() { $manager = $this->prophesize(DocumentManager::class)->reveal(); - $purger = new Purger($manager); + $purger = new ObjectManagerPurger($manager); $decoratedPurgerReflection = (new \ReflectionObject($purger))->getProperty('purger'); $decoratedPurgerReflection->setAccessible(true); @@ -50,7 +50,7 @@ public function testEmptyDatabase() $this->assertEquals(1, count($manager->getRepository(Dummy::class)->findAll())); - $purger = new Purger($manager); + $purger = new ObjectManagerPurger($manager); $purger->purge(); $this->assertEquals(0, count($manager->getRepository(Dummy::class)->findAll())); diff --git a/tests/Bridge/DoctrinePhpCr/Purger/PurgerTest.php b/tests/Bridge/DoctrinePhpCr/Purger/PurgerTest.php index 799ca343..b1dec4f5 100644 --- a/tests/Bridge/DoctrinePhpCr/Purger/PurgerTest.php +++ b/tests/Bridge/DoctrinePhpCr/Purger/PurgerTest.php @@ -17,6 +17,7 @@ use Doctrine\Common\DataFixtures\Purger\PHPCRPurger; use Doctrine\ODM\PHPCR\DocumentManager; use Fidry\AliceDataFixtures\Bridge\Doctrine\PhpCrDocument\Dummy; +use Fidry\AliceDataFixtures\Bridge\Doctrine\Purger\ObjectManagerPurger; use Fidry\AliceDataFixtures\Bridge\Doctrine\Purger\Purger; use Fidry\AliceDataFixtures\Persistence\PurgeMode; use Fidry\AliceDataFixtures\Persistence\PurgerFactoryInterface; @@ -47,7 +48,7 @@ public function testIsNotClonable() public function testCreatesADoctrineOrmPurgerWithTheAppropriateManagerAndPurgeMode() { $manager = $this->prophesize(DocumentManager::class)->reveal(); - $purger = new Purger($manager); + $purger = new ObjectManagerPurger($manager); $decoratedPurgerReflection = (new \ReflectionObject($purger))->getProperty('purger'); $decoratedPurgerReflection->setAccessible(true); @@ -70,7 +71,7 @@ public function testEmptyDatabase() $this->assertEquals(1, count($manager->getRepository(Dummy::class)->findAll())); - $purger = new Purger($manager, PurgeMode::createDeleteMode()); + $purger = new ObjectManagerPurger($manager, PurgeMode::createDeleteMode()); $purger->purge(); $this->assertEquals(0, count($manager->getRepository(Dummy::class)->findAll())); From 790fc8192ddd4661668bb36e1518bd53c864cbdf Mon Sep 17 00:00:00 2001 From: Julien Deniau Date: Mon, 19 Apr 2021 22:55:19 +0200 Subject: [PATCH 08/11] tmp --- src/Bridge/Doctrine/Persister/ManagerRegistryPersister.php | 2 +- src/Bridge/Doctrine/Purger/ManagerRegistryPurger.php | 4 ++-- src/Bridge/Doctrine/Purger/ObjectManagerPurger.php | 2 +- src/Bridge/Doctrine/Purger/Purger.php | 2 +- .../Bridge/Doctrine/Persister/ObjectManagerPersisterTest.php | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Bridge/Doctrine/Persister/ManagerRegistryPersister.php b/src/Bridge/Doctrine/Persister/ManagerRegistryPersister.php index 7fcbee7d..1419c542 100644 --- a/src/Bridge/Doctrine/Persister/ManagerRegistryPersister.php +++ b/src/Bridge/Doctrine/Persister/ManagerRegistryPersister.php @@ -13,7 +13,7 @@ namespace Fidry\AliceDataFixtures\Bridge\Doctrine\Persister; -use Doctrine\Common\Persistence\ManagerRegistry; +use Doctrine\Persistence\ManagerRegistry; use Fidry\AliceDataFixtures\Persistence\PersisterInterface; use function get_class; use function implode; diff --git a/src/Bridge/Doctrine/Purger/ManagerRegistryPurger.php b/src/Bridge/Doctrine/Purger/ManagerRegistryPurger.php index 6c840f68..3f54953a 100644 --- a/src/Bridge/Doctrine/Purger/ManagerRegistryPurger.php +++ b/src/Bridge/Doctrine/Purger/ManagerRegistryPurger.php @@ -14,8 +14,8 @@ namespace Fidry\AliceDataFixtures\Bridge\Doctrine\Persister; use function array_map; -use Doctrine\Common\Persistence\ManagerRegistry; -use Doctrine\Common\Persistence\ObjectManager; +use Doctrine\Persistence\ManagerRegistry; +use Doctrine\Persistence\ObjectManager; use Fidry\AliceDataFixtures\Bridge\Doctrine\Purger\ObjectManagerPurger; use Fidry\AliceDataFixtures\Persistence\PurgeMode; use Fidry\AliceDataFixtures\Persistence\PurgerFactoryInterface; diff --git a/src/Bridge/Doctrine/Purger/ObjectManagerPurger.php b/src/Bridge/Doctrine/Purger/ObjectManagerPurger.php index 4a074f43..7c6ea2b2 100644 --- a/src/Bridge/Doctrine/Purger/ObjectManagerPurger.php +++ b/src/Bridge/Doctrine/Purger/ObjectManagerPurger.php @@ -17,11 +17,11 @@ use Doctrine\Common\DataFixtures\Purger\ORMPurger as DoctrineOrmPurger; use Doctrine\Common\DataFixtures\Purger\PHPCRPurger as DoctrinePhpCrPurger; use Doctrine\Common\DataFixtures\Purger\PurgerInterface as DoctrinePurgerInterface; -use Doctrine\Common\Persistence\ObjectManager; use Doctrine\DBAL\Driver\AbstractMySQLDriver; use Doctrine\ODM\MongoDB\DocumentManager as DoctrineMongoDocumentManager; use Doctrine\ODM\PHPCR\DocumentManager as DoctrinePhpCrDocumentManager; use Doctrine\ORM\EntityManagerInterface; +use Doctrine\Persistence\ObjectManager; use Fidry\AliceDataFixtures\Persistence\PurgeMode; use Fidry\AliceDataFixtures\Persistence\PurgerFactoryInterface; use Fidry\AliceDataFixtures\Persistence\PurgerInterface; diff --git a/src/Bridge/Doctrine/Purger/Purger.php b/src/Bridge/Doctrine/Purger/Purger.php index 2a00be79..d3a1eebe 100644 --- a/src/Bridge/Doctrine/Purger/Purger.php +++ b/src/Bridge/Doctrine/Purger/Purger.php @@ -13,7 +13,7 @@ namespace Fidry\AliceDataFixtures\Bridge\Doctrine\Purger; -use Doctrine\Common\Persistence\ObjectManager; +use Doctrine\Persistence\ObjectManager; use const E_USER_DEPRECATED; use Fidry\AliceDataFixtures\Persistence\PurgeMode; use function trigger_error; diff --git a/tests/Bridge/Doctrine/Persister/ObjectManagerPersisterTest.php b/tests/Bridge/Doctrine/Persister/ObjectManagerPersisterTest.php index 682170af..3eea543b 100644 --- a/tests/Bridge/Doctrine/Persister/ObjectManagerPersisterTest.php +++ b/tests/Bridge/Doctrine/Persister/ObjectManagerPersisterTest.php @@ -14,10 +14,10 @@ namespace Fidry\AliceDataFixtures\Bridge\Doctrine\Persister; use Doctrine\Common\DataFixtures\Purger\ORMPurger; -use Doctrine\Common\Persistence\ManagerRegistry; use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\ORMException; use Doctrine\ORM\ORMInvalidArgumentException; +use Doctrine\Persistence\ManagerRegistry; use Fidry\AliceDataFixtures\Bridge\Doctrine\Entity\Dummy; use Fidry\AliceDataFixtures\Bridge\Doctrine\Entity\DummyEmbeddable; use Fidry\AliceDataFixtures\Bridge\Doctrine\Entity\DummySubClass; From 98c0c61ccc601a8d6bfd879e1c6f4c9becb2929d Mon Sep 17 00:00:00 2001 From: Julien Deniau Date: Mon, 19 Apr 2021 23:01:45 +0200 Subject: [PATCH 09/11] clear unit of work to avoid conflict between tests --- tests/Bridge/Doctrine/Persister/ObjectManagerPersisterTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/Bridge/Doctrine/Persister/ObjectManagerPersisterTest.php b/tests/Bridge/Doctrine/Persister/ObjectManagerPersisterTest.php index 3eea543b..4d336ca1 100644 --- a/tests/Bridge/Doctrine/Persister/ObjectManagerPersisterTest.php +++ b/tests/Bridge/Doctrine/Persister/ObjectManagerPersisterTest.php @@ -77,6 +77,7 @@ public function setUp(): void */ public function tearDown(): void { + $this->entityManager->getUnitOfWork()->clear(); $this->purger->purge(); } From 21255fe2f428eeac79e4fa98e9461b897b5d439d Mon Sep 17 00:00:00 2001 From: Julien Deniau Date: Mon, 19 Apr 2021 23:30:42 +0200 Subject: [PATCH 10/11] use ManagerRegistryPurger for doctrine orm, odm and phpcr --- .../Symfony/Resources/config/doctrine_mongodb_odm.xml | 4 ++-- src/Bridge/Symfony/Resources/config/doctrine_orm.xml | 5 ++--- .../Symfony/Resources/config/doctrine_phpcr_odm.xml | 10 ++++------ 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/Bridge/Symfony/Resources/config/doctrine_mongodb_odm.xml b/src/Bridge/Symfony/Resources/config/doctrine_mongodb_odm.xml index b3e40bdd..0587fe7d 100644 --- a/src/Bridge/Symfony/Resources/config/doctrine_mongodb_odm.xml +++ b/src/Bridge/Symfony/Resources/config/doctrine_mongodb_odm.xml @@ -49,10 +49,10 @@ public="true" /> - + - - + - - + - - + From 20e5db223ae75d4c25a916f912877214b56147b5 Mon Sep 17 00:00:00 2001 From: Julien Deniau Date: Mon, 19 Apr 2021 23:41:56 +0200 Subject: [PATCH 11/11] fix wrong namespace --- src/Bridge/Doctrine/Purger/ManagerRegistryPurger.php | 3 +-- src/Bridge/Symfony/Resources/config/doctrine_mongodb_odm.xml | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Bridge/Doctrine/Purger/ManagerRegistryPurger.php b/src/Bridge/Doctrine/Purger/ManagerRegistryPurger.php index 3f54953a..698ab2e1 100644 --- a/src/Bridge/Doctrine/Purger/ManagerRegistryPurger.php +++ b/src/Bridge/Doctrine/Purger/ManagerRegistryPurger.php @@ -11,12 +11,11 @@ declare(strict_types=1); -namespace Fidry\AliceDataFixtures\Bridge\Doctrine\Persister; +namespace Fidry\AliceDataFixtures\Bridge\Doctrine\Purger; use function array_map; use Doctrine\Persistence\ManagerRegistry; use Doctrine\Persistence\ObjectManager; -use Fidry\AliceDataFixtures\Bridge\Doctrine\Purger\ObjectManagerPurger; use Fidry\AliceDataFixtures\Persistence\PurgeMode; use Fidry\AliceDataFixtures\Persistence\PurgerFactoryInterface; use Fidry\AliceDataFixtures\Persistence\PurgerInterface; diff --git a/src/Bridge/Symfony/Resources/config/doctrine_mongodb_odm.xml b/src/Bridge/Symfony/Resources/config/doctrine_mongodb_odm.xml index 0587fe7d..47ee2afe 100644 --- a/src/Bridge/Symfony/Resources/config/doctrine_mongodb_odm.xml +++ b/src/Bridge/Symfony/Resources/config/doctrine_mongodb_odm.xml @@ -51,7 +51,6 @@ -