diff --git a/lib/DI/ContainerConfigurator.php b/lib/DI/ContainerConfigurator.php index a3b89a0d66..7f9f164468 100644 --- a/lib/DI/ContainerConfigurator.php +++ b/lib/DI/ContainerConfigurator.php @@ -105,6 +105,7 @@ class ContainerConfigurator implements IContainerConfigurator { ->setPublic(true) ->setFactory([new Reference(\MailPoet\Config\RendererFactory::class), 'getRenderer']); // Doctrine + $container->autowire(\MailPoet\Doctrine\Annotations\AnnotationReaderProvider::class); $container->autowire(\MailPoet\Doctrine\ConfigurationFactory::class); $container->autowire(\MailPoet\Doctrine\ConnectionFactory::class); $container->autowire(\MailPoet\Doctrine\EntityManagerFactory::class); diff --git a/lib/Doctrine/Annotations/AnnotationReaderProvider.php b/lib/Doctrine/Annotations/AnnotationReaderProvider.php new file mode 100644 index 0000000000..4df19bb7cb --- /dev/null +++ b/lib/Doctrine/Annotations/AnnotationReaderProvider.php @@ -0,0 +1,30 @@ +annotation_reader = new CachedReader(new AnnotationReader(), new ArrayCache()); + } + } + + /** @return CachedReader|null */ + function getAnnotationReader() { + return $this->annotation_reader; + } +} diff --git a/lib/Doctrine/ConfigurationFactory.php b/lib/Doctrine/ConfigurationFactory.php index d0eaf4a843..765a982814 100644 --- a/lib/Doctrine/ConfigurationFactory.php +++ b/lib/Doctrine/ConfigurationFactory.php @@ -2,11 +2,11 @@ namespace MailPoet\Doctrine; -use MailPoetVendor\Doctrine\Common\Annotations\AnnotationRegistry; -use MailPoetVendor\Doctrine\Common\Annotations\SimpleAnnotationReader; +use MailPoet\Doctrine\Annotations\AnnotationReaderProvider; use MailPoetVendor\Doctrine\Common\Cache\ArrayCache; use MailPoetVendor\Doctrine\Common\Proxy\AbstractProxyFactory; use MailPoetVendor\Doctrine\ORM\Configuration; +use MailPoetVendor\Doctrine\ORM\Mapping\Driver\AnnotationDriver; use MailPoetVendor\Doctrine\ORM\Mapping\Driver\PHPDriver; use MailPoetVendor\Doctrine\ORM\Mapping\UnderscoreNamingStrategy; @@ -19,8 +19,12 @@ class ConfigurationFactory { /** @var bool */ private $is_dev_mode; - function __construct($is_dev_mode = null) { + /** @var AnnotationReaderProvider */ + private $annotation_reader_provider; + + function __construct($is_dev_mode = null, AnnotationReaderProvider $annotation_reader_provider) { $this->is_dev_mode = $is_dev_mode === null ? WP_DEBUG : $is_dev_mode; + $this->annotation_reader_provider = $annotation_reader_provider; } function createConfiguration() { @@ -40,14 +44,10 @@ class ConfigurationFactory { $metadata_storage = new MetadataCache(self::METADATA_DIR); $configuration->setMetadataCacheImpl($metadata_storage); - // autoload all annotation classes using registered loaders (Composer) - // (needed for Symfony\Validator constraint annotations to be loaded) - AnnotationRegistry::registerLoader('class_exists'); - - // register annotation reader if doctrine/annotations package is installed - // (i.e. in dev environment, on production metadata is dumped in the build) - if (class_exists(SimpleAnnotationReader::class)) { - $configuration->setMetadataDriverImpl($configuration->newDefaultAnnotationDriver([self::ENTITY_DIR], false)); + // annotation reader exists only in dev environment, on production cache is pre-generated + $annotation_reader = $this->annotation_reader_provider->getAnnotationReader(); + if ($annotation_reader) { + $configuration->setMetadataDriverImpl(new AnnotationDriver($annotation_reader, [self::ENTITY_DIR])); } else { // Should never be called but Doctrine requires having driver set $configuration->setMetadataDriverImpl(new PHPDriver([])); diff --git a/tests/integration/Doctrine/ConfigurationFactoryTest.php b/tests/integration/Doctrine/ConfigurationFactoryTest.php index 87246f763b..65353a8072 100644 --- a/tests/integration/Doctrine/ConfigurationFactoryTest.php +++ b/tests/integration/Doctrine/ConfigurationFactoryTest.php @@ -2,6 +2,7 @@ namespace MailPoet\Test\Config; +use MailPoet\Doctrine\Annotations\AnnotationReaderProvider; use MailPoet\Doctrine\ConfigurationFactory; use MailPoet\Doctrine\MetadataCache; use MailPoet\Doctrine\TablePrefixMetadataFactory; @@ -13,7 +14,7 @@ use MailPoetVendor\Doctrine\ORM\Mapping\UnderscoreNamingStrategy; class ConfigurationFactoryTest extends \MailPoetTest { function testItSetsUpBasicOptions() { - $configuration_factory = new ConfigurationFactory(); + $configuration_factory = new ConfigurationFactory(false, new AnnotationReaderProvider()); $configuration = $configuration_factory->createConfiguration(); expect($configuration)->isInstanceOf(Configuration::class); @@ -35,12 +36,12 @@ class ConfigurationFactoryTest extends \MailPoetTest { function testItSetsUpEnvironmentSpecificOptions() { // dev mode - $configuration_factory = new ConfigurationFactory(true); + $configuration_factory = new ConfigurationFactory(true, new AnnotationReaderProvider()); $configuration = $configuration_factory->createConfiguration(); expect($configuration->getAutoGenerateProxyClasses())->equals(AbstractProxyFactory::AUTOGENERATE_FILE_NOT_EXISTS); // production mode - $configuration_factory = new ConfigurationFactory(false); + $configuration_factory = new ConfigurationFactory(false, new AnnotationReaderProvider()); $configuration = $configuration_factory->createConfiguration(); expect($configuration->getAutoGenerateProxyClasses())->equals(AbstractProxyFactory::AUTOGENERATE_NEVER); } diff --git a/tests/integration/Doctrine/EventListeners/TimestampListenerTest.php b/tests/integration/Doctrine/EventListeners/TimestampListenerTest.php index c1a655ba25..08c7eb7500 100644 --- a/tests/integration/Doctrine/EventListeners/TimestampListenerTest.php +++ b/tests/integration/Doctrine/EventListeners/TimestampListenerTest.php @@ -3,6 +3,7 @@ namespace MailPoet\Test\Doctrine\EventListeners; use Carbon\Carbon; +use MailPoet\Doctrine\Annotations\AnnotationReaderProvider; use MailPoet\Doctrine\ConfigurationFactory; use MailPoet\Doctrine\EntityManagerFactory; use MailPoet\Doctrine\EventListeners\TimestampListener; @@ -77,7 +78,8 @@ class TimestampListenerTest extends \MailPoetTest { } private function createEntityManager() { - $configuration_factory = new ConfigurationFactory(); + $annotation_reader_provider = new AnnotationReaderProvider(); + $configuration_factory = new ConfigurationFactory(false, $annotation_reader_provider); $configuration = $configuration_factory->createConfiguration(); $metadata_driver = $configuration->newDefaultAnnotationDriver([__DIR__], false); diff --git a/tests/integration/Doctrine/EventListeners/ValidationTest.php b/tests/integration/Doctrine/EventListeners/ValidationTest.php index de13a92f67..62085906af 100644 --- a/tests/integration/Doctrine/EventListeners/ValidationTest.php +++ b/tests/integration/Doctrine/EventListeners/ValidationTest.php @@ -2,6 +2,7 @@ namespace MailPoet\Test\Doctrine\EventListeners; +use MailPoet\Doctrine\Annotations\AnnotationReaderProvider; use MailPoet\Doctrine\ConfigurationFactory; use MailPoet\Doctrine\EntityManagerFactory; use MailPoet\Doctrine\EventListeners\TimestampListener; @@ -61,7 +62,8 @@ class ValidationTest extends \MailPoetTest { } private function createEntityManager() { - $configuration_factory = new ConfigurationFactory(); + $annotation_reader_provider = new AnnotationReaderProvider(); + $configuration_factory = new ConfigurationFactory(false, $annotation_reader_provider); $configuration = $configuration_factory->createConfiguration(); $metadata_driver = $configuration->newDefaultAnnotationDriver([__DIR__], false); diff --git a/tests/integration/Doctrine/Types/JsonTypesTest.php b/tests/integration/Doctrine/Types/JsonTypesTest.php index bd44472387..3081ba735b 100644 --- a/tests/integration/Doctrine/Types/JsonTypesTest.php +++ b/tests/integration/Doctrine/Types/JsonTypesTest.php @@ -3,6 +3,7 @@ namespace MailPoet\Test\Doctrine\EventListeners; use Exception; +use MailPoet\Doctrine\Annotations\AnnotationReaderProvider; use MailPoet\Doctrine\ConfigurationFactory; use MailPoet\Doctrine\EntityManagerFactory; use MailPoet\Doctrine\EventListeners\TimestampListener; @@ -151,7 +152,8 @@ class JsonTypesTest extends \MailPoetTest { } private function createEntityManager() { - $configuration_factory = new ConfigurationFactory(); + $annotation_reader_provider = new AnnotationReaderProvider(); + $configuration_factory = new ConfigurationFactory(false, $annotation_reader_provider); $configuration = $configuration_factory->createConfiguration(); $metadata_driver = $configuration->newDefaultAnnotationDriver([__DIR__], false);