Extract annotation reader setup to a provider class
[MAILPOET-2437]
This commit is contained in:
committed by
Jack Kitterhing
parent
0bfeaab160
commit
68c1b62df5
@ -105,6 +105,7 @@ class ContainerConfigurator implements IContainerConfigurator {
|
|||||||
->setPublic(true)
|
->setPublic(true)
|
||||||
->setFactory([new Reference(\MailPoet\Config\RendererFactory::class), 'getRenderer']);
|
->setFactory([new Reference(\MailPoet\Config\RendererFactory::class), 'getRenderer']);
|
||||||
// Doctrine
|
// Doctrine
|
||||||
|
$container->autowire(\MailPoet\Doctrine\Annotations\AnnotationReaderProvider::class);
|
||||||
$container->autowire(\MailPoet\Doctrine\ConfigurationFactory::class);
|
$container->autowire(\MailPoet\Doctrine\ConfigurationFactory::class);
|
||||||
$container->autowire(\MailPoet\Doctrine\ConnectionFactory::class);
|
$container->autowire(\MailPoet\Doctrine\ConnectionFactory::class);
|
||||||
$container->autowire(\MailPoet\Doctrine\EntityManagerFactory::class);
|
$container->autowire(\MailPoet\Doctrine\EntityManagerFactory::class);
|
||||||
|
30
lib/Doctrine/Annotations/AnnotationReaderProvider.php
Normal file
30
lib/Doctrine/Annotations/AnnotationReaderProvider.php
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace MailPoet\Doctrine\Annotations;
|
||||||
|
|
||||||
|
use MailPoetVendor\Doctrine\Common\Annotations\AnnotationReader;
|
||||||
|
use MailPoetVendor\Doctrine\Common\Annotations\AnnotationRegistry;
|
||||||
|
use MailPoetVendor\Doctrine\Common\Annotations\CachedReader;
|
||||||
|
use MailPoetVendor\Doctrine\Common\Cache\ArrayCache;
|
||||||
|
|
||||||
|
class AnnotationReaderProvider {
|
||||||
|
/** @var CachedReader */
|
||||||
|
private $annotation_reader;
|
||||||
|
|
||||||
|
function __construct() {
|
||||||
|
// register annotation reader if doctrine/annotations package is installed
|
||||||
|
// (i.e. in dev environment, on production metadata is dumped in the build)
|
||||||
|
$read_annotations = class_exists(CachedReader::class) && class_exists(AnnotationReader::class);
|
||||||
|
if ($read_annotations) {
|
||||||
|
// autoload all annotation classes using registered loaders (Composer)
|
||||||
|
// (needed for Symfony\Validator constraint annotations to be loaded)
|
||||||
|
AnnotationRegistry::registerLoader('class_exists');
|
||||||
|
$this->annotation_reader = new CachedReader(new AnnotationReader(), new ArrayCache());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @return CachedReader|null */
|
||||||
|
function getAnnotationReader() {
|
||||||
|
return $this->annotation_reader;
|
||||||
|
}
|
||||||
|
}
|
@ -2,11 +2,11 @@
|
|||||||
|
|
||||||
namespace MailPoet\Doctrine;
|
namespace MailPoet\Doctrine;
|
||||||
|
|
||||||
use MailPoetVendor\Doctrine\Common\Annotations\AnnotationRegistry;
|
use MailPoet\Doctrine\Annotations\AnnotationReaderProvider;
|
||||||
use MailPoetVendor\Doctrine\Common\Annotations\SimpleAnnotationReader;
|
|
||||||
use MailPoetVendor\Doctrine\Common\Cache\ArrayCache;
|
use MailPoetVendor\Doctrine\Common\Cache\ArrayCache;
|
||||||
use MailPoetVendor\Doctrine\Common\Proxy\AbstractProxyFactory;
|
use MailPoetVendor\Doctrine\Common\Proxy\AbstractProxyFactory;
|
||||||
use MailPoetVendor\Doctrine\ORM\Configuration;
|
use MailPoetVendor\Doctrine\ORM\Configuration;
|
||||||
|
use MailPoetVendor\Doctrine\ORM\Mapping\Driver\AnnotationDriver;
|
||||||
use MailPoetVendor\Doctrine\ORM\Mapping\Driver\PHPDriver;
|
use MailPoetVendor\Doctrine\ORM\Mapping\Driver\PHPDriver;
|
||||||
use MailPoetVendor\Doctrine\ORM\Mapping\UnderscoreNamingStrategy;
|
use MailPoetVendor\Doctrine\ORM\Mapping\UnderscoreNamingStrategy;
|
||||||
|
|
||||||
@ -19,8 +19,12 @@ class ConfigurationFactory {
|
|||||||
/** @var bool */
|
/** @var bool */
|
||||||
private $is_dev_mode;
|
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->is_dev_mode = $is_dev_mode === null ? WP_DEBUG : $is_dev_mode;
|
||||||
|
$this->annotation_reader_provider = $annotation_reader_provider;
|
||||||
}
|
}
|
||||||
|
|
||||||
function createConfiguration() {
|
function createConfiguration() {
|
||||||
@ -40,14 +44,10 @@ class ConfigurationFactory {
|
|||||||
$metadata_storage = new MetadataCache(self::METADATA_DIR);
|
$metadata_storage = new MetadataCache(self::METADATA_DIR);
|
||||||
$configuration->setMetadataCacheImpl($metadata_storage);
|
$configuration->setMetadataCacheImpl($metadata_storage);
|
||||||
|
|
||||||
// autoload all annotation classes using registered loaders (Composer)
|
// annotation reader exists only in dev environment, on production cache is pre-generated
|
||||||
// (needed for Symfony\Validator constraint annotations to be loaded)
|
$annotation_reader = $this->annotation_reader_provider->getAnnotationReader();
|
||||||
AnnotationRegistry::registerLoader('class_exists');
|
if ($annotation_reader) {
|
||||||
|
$configuration->setMetadataDriverImpl(new AnnotationDriver($annotation_reader, [self::ENTITY_DIR]));
|
||||||
// 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));
|
|
||||||
} else {
|
} else {
|
||||||
// Should never be called but Doctrine requires having driver set
|
// Should never be called but Doctrine requires having driver set
|
||||||
$configuration->setMetadataDriverImpl(new PHPDriver([]));
|
$configuration->setMetadataDriverImpl(new PHPDriver([]));
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
namespace MailPoet\Test\Config;
|
namespace MailPoet\Test\Config;
|
||||||
|
|
||||||
|
use MailPoet\Doctrine\Annotations\AnnotationReaderProvider;
|
||||||
use MailPoet\Doctrine\ConfigurationFactory;
|
use MailPoet\Doctrine\ConfigurationFactory;
|
||||||
use MailPoet\Doctrine\MetadataCache;
|
use MailPoet\Doctrine\MetadataCache;
|
||||||
use MailPoet\Doctrine\TablePrefixMetadataFactory;
|
use MailPoet\Doctrine\TablePrefixMetadataFactory;
|
||||||
@ -13,7 +14,7 @@ use MailPoetVendor\Doctrine\ORM\Mapping\UnderscoreNamingStrategy;
|
|||||||
|
|
||||||
class ConfigurationFactoryTest extends \MailPoetTest {
|
class ConfigurationFactoryTest extends \MailPoetTest {
|
||||||
function testItSetsUpBasicOptions() {
|
function testItSetsUpBasicOptions() {
|
||||||
$configuration_factory = new ConfigurationFactory();
|
$configuration_factory = new ConfigurationFactory(false, new AnnotationReaderProvider());
|
||||||
$configuration = $configuration_factory->createConfiguration();
|
$configuration = $configuration_factory->createConfiguration();
|
||||||
|
|
||||||
expect($configuration)->isInstanceOf(Configuration::class);
|
expect($configuration)->isInstanceOf(Configuration::class);
|
||||||
@ -35,12 +36,12 @@ class ConfigurationFactoryTest extends \MailPoetTest {
|
|||||||
|
|
||||||
function testItSetsUpEnvironmentSpecificOptions() {
|
function testItSetsUpEnvironmentSpecificOptions() {
|
||||||
// dev mode
|
// dev mode
|
||||||
$configuration_factory = new ConfigurationFactory(true);
|
$configuration_factory = new ConfigurationFactory(true, new AnnotationReaderProvider());
|
||||||
$configuration = $configuration_factory->createConfiguration();
|
$configuration = $configuration_factory->createConfiguration();
|
||||||
expect($configuration->getAutoGenerateProxyClasses())->equals(AbstractProxyFactory::AUTOGENERATE_FILE_NOT_EXISTS);
|
expect($configuration->getAutoGenerateProxyClasses())->equals(AbstractProxyFactory::AUTOGENERATE_FILE_NOT_EXISTS);
|
||||||
|
|
||||||
// production mode
|
// production mode
|
||||||
$configuration_factory = new ConfigurationFactory(false);
|
$configuration_factory = new ConfigurationFactory(false, new AnnotationReaderProvider());
|
||||||
$configuration = $configuration_factory->createConfiguration();
|
$configuration = $configuration_factory->createConfiguration();
|
||||||
expect($configuration->getAutoGenerateProxyClasses())->equals(AbstractProxyFactory::AUTOGENERATE_NEVER);
|
expect($configuration->getAutoGenerateProxyClasses())->equals(AbstractProxyFactory::AUTOGENERATE_NEVER);
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
namespace MailPoet\Test\Doctrine\EventListeners;
|
namespace MailPoet\Test\Doctrine\EventListeners;
|
||||||
|
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
|
use MailPoet\Doctrine\Annotations\AnnotationReaderProvider;
|
||||||
use MailPoet\Doctrine\ConfigurationFactory;
|
use MailPoet\Doctrine\ConfigurationFactory;
|
||||||
use MailPoet\Doctrine\EntityManagerFactory;
|
use MailPoet\Doctrine\EntityManagerFactory;
|
||||||
use MailPoet\Doctrine\EventListeners\TimestampListener;
|
use MailPoet\Doctrine\EventListeners\TimestampListener;
|
||||||
@ -77,7 +78,8 @@ class TimestampListenerTest extends \MailPoetTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private function createEntityManager() {
|
private function createEntityManager() {
|
||||||
$configuration_factory = new ConfigurationFactory();
|
$annotation_reader_provider = new AnnotationReaderProvider();
|
||||||
|
$configuration_factory = new ConfigurationFactory(false, $annotation_reader_provider);
|
||||||
$configuration = $configuration_factory->createConfiguration();
|
$configuration = $configuration_factory->createConfiguration();
|
||||||
|
|
||||||
$metadata_driver = $configuration->newDefaultAnnotationDriver([__DIR__], false);
|
$metadata_driver = $configuration->newDefaultAnnotationDriver([__DIR__], false);
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
namespace MailPoet\Test\Doctrine\EventListeners;
|
namespace MailPoet\Test\Doctrine\EventListeners;
|
||||||
|
|
||||||
|
use MailPoet\Doctrine\Annotations\AnnotationReaderProvider;
|
||||||
use MailPoet\Doctrine\ConfigurationFactory;
|
use MailPoet\Doctrine\ConfigurationFactory;
|
||||||
use MailPoet\Doctrine\EntityManagerFactory;
|
use MailPoet\Doctrine\EntityManagerFactory;
|
||||||
use MailPoet\Doctrine\EventListeners\TimestampListener;
|
use MailPoet\Doctrine\EventListeners\TimestampListener;
|
||||||
@ -61,7 +62,8 @@ class ValidationTest extends \MailPoetTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private function createEntityManager() {
|
private function createEntityManager() {
|
||||||
$configuration_factory = new ConfigurationFactory();
|
$annotation_reader_provider = new AnnotationReaderProvider();
|
||||||
|
$configuration_factory = new ConfigurationFactory(false, $annotation_reader_provider);
|
||||||
$configuration = $configuration_factory->createConfiguration();
|
$configuration = $configuration_factory->createConfiguration();
|
||||||
|
|
||||||
$metadata_driver = $configuration->newDefaultAnnotationDriver([__DIR__], false);
|
$metadata_driver = $configuration->newDefaultAnnotationDriver([__DIR__], false);
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
namespace MailPoet\Test\Doctrine\EventListeners;
|
namespace MailPoet\Test\Doctrine\EventListeners;
|
||||||
|
|
||||||
use Exception;
|
use Exception;
|
||||||
|
use MailPoet\Doctrine\Annotations\AnnotationReaderProvider;
|
||||||
use MailPoet\Doctrine\ConfigurationFactory;
|
use MailPoet\Doctrine\ConfigurationFactory;
|
||||||
use MailPoet\Doctrine\EntityManagerFactory;
|
use MailPoet\Doctrine\EntityManagerFactory;
|
||||||
use MailPoet\Doctrine\EventListeners\TimestampListener;
|
use MailPoet\Doctrine\EventListeners\TimestampListener;
|
||||||
@ -151,7 +152,8 @@ class JsonTypesTest extends \MailPoetTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private function createEntityManager() {
|
private function createEntityManager() {
|
||||||
$configuration_factory = new ConfigurationFactory();
|
$annotation_reader_provider = new AnnotationReaderProvider();
|
||||||
|
$configuration_factory = new ConfigurationFactory(false, $annotation_reader_provider);
|
||||||
$configuration = $configuration_factory->createConfiguration();
|
$configuration = $configuration_factory->createConfiguration();
|
||||||
|
|
||||||
$metadata_driver = $configuration->newDefaultAnnotationDriver([__DIR__], false);
|
$metadata_driver = $configuration->newDefaultAnnotationDriver([__DIR__], false);
|
||||||
|
Reference in New Issue
Block a user