From bcc37f140a64385d1295880ffaa7b1a28666fc2f Mon Sep 17 00:00:00 2001 From: Erik Norgren Date: Tue, 1 Aug 2017 12:49:40 +0200 Subject: [PATCH 1/3] Cache the zf2 service manager so it is not recreated with each behat context creation. --- src/Context/EntityFixtureContext.php | 1 + src/Context/EntityHydrationTrait.php | 4 ++ .../Initializer/ServiceManagerInitializer.php | 66 ++++++++++++++++--- 3 files changed, 63 insertions(+), 8 deletions(-) diff --git a/src/Context/EntityFixtureContext.php b/src/Context/EntityFixtureContext.php index eadf6c8..83fcc9a 100644 --- a/src/Context/EntityFixtureContext.php +++ b/src/Context/EntityFixtureContext.php @@ -16,6 +16,7 @@ use Doctrine\ORM\OptimisticLockException; use Doctrine\ORM\ORMException; use Doctrine\ORM\TransactionRequiredException; +use Epulze\Match\Entity\MatchEntity; use InteractiveSolutions\ZfBehat\Options\EntityOptions; use RuntimeException; use Zend\ServiceManager\ServiceManager; diff --git a/src/Context/EntityHydrationTrait.php b/src/Context/EntityHydrationTrait.php index c3f9eca..9409878 100644 --- a/src/Context/EntityHydrationTrait.php +++ b/src/Context/EntityHydrationTrait.php @@ -46,6 +46,10 @@ private function hydrateEntity(ClassMetadata $metadata, $entity, $values) $this->setBoolFieldOfObject($entity, $field, $values[$field]); break; + case Type::INTEGER: + $this->setFieldOfObject($entity, $field, (int) $values[$field]); + break; + default: $this->setFieldOfObject($entity, $field, $values[$field]); } diff --git a/src/Context/Initializer/ServiceManagerInitializer.php b/src/Context/Initializer/ServiceManagerInitializer.php index 511e830..c085fe7 100644 --- a/src/Context/Initializer/ServiceManagerInitializer.php +++ b/src/Context/Initializer/ServiceManagerInitializer.php @@ -9,6 +9,7 @@ use Behat\Behat\Context\Context; use Behat\Behat\Context\Initializer\ContextInitializer; +use Doctrine\ORM\EntityManager; use Zend\Mvc\Service\ServiceManagerConfig; use Zend\ServiceManager\ServiceLocatorAwareInterface; use Zend\ServiceManager\ServiceManager; @@ -21,6 +22,11 @@ class ServiceManagerInitializer implements ContextInitializer */ private $file; + /** + * @var ServiceManager + */ + private $serviceManager; + /** * @param string $file */ @@ -44,16 +50,60 @@ public function initializeContext(Context $context) throw new \LogicException(sprintf('The file %s was not found', $this->file)); } - // We _should_ always be in the root of a zf2 project when executing this - $config = include $this->file; + if (!$this->serviceManager) { + // We _should_ always be in the root of a zf2 project when executing this + $config = include $this->file; + + $this->serviceManager = new ServiceManager(new ServiceManagerConfig($config)); + $this->serviceManager->setService('ApplicationConfig', $config); + + /* @var $moduleManager \Zend\ModuleManager\ModuleManager */ + $moduleManager = $this->serviceManager->get('ModuleManager'); + $moduleManager->loadModules(); + + $this->clearDoctrineCacheAndGenerateProxies(); + } + + /* @var EntityManager $entityManager */ + $entityManager = $this->serviceManager->get(EntityManager::class); + + if (!$entityManager->isOpen()) { + $this->serviceManager->setAllowOverride(true); + $this->serviceManager->setService( + EntityManager::class, + EntityManager::create( + $entityManager->getConnection(), + $entityManager->getConfiguration() + ) + ); + } + + $context->setServiceManager($this->serviceManager); + } + + /** + * Clear the doctrine cache and generate doctrine proxies + */ + private function clearDoctrineCacheAndGenerateProxies() + { + /* @var EntityManager $entityManager */ + $entityManager = $this->serviceManager->get(EntityManager::class); + + // Clear doctrine cache + $cacheDriver = $entityManager->getConfiguration()->getMetadataCacheImpl(); + $cacheDriver->deleteAll(); + + $cacheDriver = $entityManager->getConfiguration()->getQueryCacheImpl(); + $cacheDriver->deleteAll(); - $serviceManager = new ServiceManager(new ServiceManagerConfig($config)); - $serviceManager->setService('ApplicationConfig', $config); + $cacheDriver = $entityManager->getConfiguration()->getResultCacheImpl(); + $cacheDriver->deleteAll(); - /* @var $moduleManager \Zend\ModuleManager\ModuleManager */ - $moduleManager = $serviceManager->get('ModuleManager'); - $moduleManager->loadModules(); + // Generate proxies + $destPath = $entityManager->getConfiguration()->getProxyDir(); + $metadatas = $entityManager->getMetadataFactory()->getAllMetadata(); + $entityManager->getProxyFactory()->generateProxyClasses($metadatas, $destPath); - $context->setServiceManager($serviceManager); + $this->hasGeneratedProxiesAndClearedDoctrineCache = true; } } From 1911f2c16e5ac90062e66b1cd64d8a31371af4c0 Mon Sep 17 00:00:00 2001 From: Erik Norgren Date: Tue, 1 Aug 2017 12:52:10 +0200 Subject: [PATCH 2/3] Oops forgot some debugging stuff. --- src/Context/EntityFixtureContext.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/Context/EntityFixtureContext.php b/src/Context/EntityFixtureContext.php index 83fcc9a..e8a361f 100644 --- a/src/Context/EntityFixtureContext.php +++ b/src/Context/EntityFixtureContext.php @@ -9,14 +9,11 @@ use Behat\Behat\Context\SnippetAcceptingContext; use Behat\Behat\Hook\Scope\BeforeScenarioScope; use Behat\Gherkin\Node\TableNode; -use DateTime; -use Doctrine\Common\Persistence\Mapping\ClassMetadata; use Doctrine\ORM\EntityManager; use Doctrine\ORM\Mapping\ClassMetadataInfo; use Doctrine\ORM\OptimisticLockException; use Doctrine\ORM\ORMException; use Doctrine\ORM\TransactionRequiredException; -use Epulze\Match\Entity\MatchEntity; use InteractiveSolutions\ZfBehat\Options\EntityOptions; use RuntimeException; use Zend\ServiceManager\ServiceManager; From 013301113040c16f05fa1b417226a66a1cfb4b04 Mon Sep 17 00:00:00 2001 From: Erik Norgren Date: Tue, 1 Aug 2017 13:37:04 +0200 Subject: [PATCH 3/3] no longer generate proxies. --- .../Initializer/ServiceManagerInitializer.php | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/src/Context/Initializer/ServiceManagerInitializer.php b/src/Context/Initializer/ServiceManagerInitializer.php index c085fe7..71f14e8 100644 --- a/src/Context/Initializer/ServiceManagerInitializer.php +++ b/src/Context/Initializer/ServiceManagerInitializer.php @@ -61,7 +61,7 @@ public function initializeContext(Context $context) $moduleManager = $this->serviceManager->get('ModuleManager'); $moduleManager->loadModules(); - $this->clearDoctrineCacheAndGenerateProxies(); + $this->clearDoctrineCache(); } /* @var EntityManager $entityManager */ @@ -82,9 +82,9 @@ public function initializeContext(Context $context) } /** - * Clear the doctrine cache and generate doctrine proxies + * Clear the doctrine cache */ - private function clearDoctrineCacheAndGenerateProxies() + private function clearDoctrineCache() { /* @var EntityManager $entityManager */ $entityManager = $this->serviceManager->get(EntityManager::class); @@ -98,12 +98,5 @@ private function clearDoctrineCacheAndGenerateProxies() $cacheDriver = $entityManager->getConfiguration()->getResultCacheImpl(); $cacheDriver->deleteAll(); - - // Generate proxies - $destPath = $entityManager->getConfiguration()->getProxyDir(); - $metadatas = $entityManager->getMetadataFactory()->getAllMetadata(); - $entityManager->getProxyFactory()->generateProxyClasses($metadatas, $destPath); - - $this->hasGeneratedProxiesAndClearedDoctrineCache = true; } }