diff --git a/lib/DI/ContainerConfigurator.php b/lib/DI/ContainerConfigurator.php index 7f9f164468..be11cda632 100644 --- a/lib/DI/ContainerConfigurator.php +++ b/lib/DI/ContainerConfigurator.php @@ -119,6 +119,9 @@ class ContainerConfigurator implements IContainerConfigurator { ->setPublic(true); $container->autowire(\MailPoet\Doctrine\EventListeners\TimestampListener::class); $container->autowire(\MailPoet\Doctrine\EventListeners\ValidationListener::class); + $container->autowire(\MailPoet\Doctrine\Validator\ValidatorFactory::class); + $container->autowire(\MailPoetVendor\Symfony\Component\Validator\Validator\ValidatorInterface::class) + ->setFactory([new Reference(\MailPoet\Doctrine\Validator\ValidatorFactory::class), 'createValidator']); // Dynamic segments $container->autowire(\MailPoet\DynamicSegments\DynamicSegmentHooks::class); // Cron diff --git a/lib/Doctrine/EventListeners/ValidationListener.php b/lib/Doctrine/EventListeners/ValidationListener.php index b5bbe2b856..5afb2c755e 100644 --- a/lib/Doctrine/EventListeners/ValidationListener.php +++ b/lib/Doctrine/EventListeners/ValidationListener.php @@ -4,17 +4,14 @@ namespace MailPoet\Doctrine\EventListeners; use MailPoet\Doctrine\ValidationException; use MailPoetVendor\Doctrine\ORM\Event\OnFlushEventArgs; -use MailPoetVendor\Symfony\Component\Validator\Validation; use MailPoetVendor\Symfony\Component\Validator\Validator\ValidatorInterface; class ValidationListener { /** @var ValidatorInterface */ private $validator; - function __construct() { - $this->validator = Validation::createValidatorBuilder() - ->enableAnnotationMapping() - ->getValidator(); + function __construct(ValidatorInterface $validator) { + $this->validator = $validator; } function onFlush(OnFlushEventArgs $event_args) { diff --git a/lib/Doctrine/Validator/ValidatorFactory.php b/lib/Doctrine/Validator/ValidatorFactory.php new file mode 100644 index 0000000000..ec9b31e19d --- /dev/null +++ b/lib/Doctrine/Validator/ValidatorFactory.php @@ -0,0 +1,36 @@ +annotation_reader_provider = $annotation_reader_provider; + } + + function createValidator() { + $builder = Validation::createValidatorBuilder(); + + // annotation reader exists only in dev environment, on production cache is pre-generated + $annotation_reader = $this->annotation_reader_provider->getAnnotationReader(); + if ($annotation_reader) { + $builder->enableAnnotationMapping($annotation_reader); + } + + // metadata cache (for production cache is pre-generated at build time) + $is_read_only = !$annotation_reader; + $metadata_cache = new MetadataCache(self::METADATA_DIR, $is_read_only); + $builder->setMetadataCache(new DoctrineCache($metadata_cache)); + + return $builder->getValidator(); + } +} diff --git a/tests/integration/Doctrine/EventListeners/TimestampListenerTest.php b/tests/integration/Doctrine/EventListeners/TimestampListenerTest.php index 08c7eb7500..a0bd8f9241 100644 --- a/tests/integration/Doctrine/EventListeners/TimestampListenerTest.php +++ b/tests/integration/Doctrine/EventListeners/TimestampListenerTest.php @@ -8,6 +8,7 @@ use MailPoet\Doctrine\ConfigurationFactory; use MailPoet\Doctrine\EntityManagerFactory; use MailPoet\Doctrine\EventListeners\TimestampListener; use MailPoet\Doctrine\EventListeners\ValidationListener; +use MailPoet\Doctrine\Validator\ValidatorFactory; use MailPoet\WP\Functions as WPFunctions; use MailPoetVendor\Doctrine\Common\Cache\ArrayCache; @@ -86,8 +87,9 @@ class TimestampListenerTest extends \MailPoetTest { $configuration->setMetadataDriverImpl($metadata_driver); $configuration->setMetadataCacheImpl(new ArrayCache()); + $validator_factory = new ValidatorFactory($annotation_reader_provider); $timestamp_listener = new TimestampListener($this->wp); - $validation_listener = new ValidationListener(); + $validation_listener = new ValidationListener($validator_factory->createValidator()); $entity_manager_factory = new EntityManagerFactory($this->connection, $configuration, $timestamp_listener, $validation_listener); return $entity_manager_factory->createEntityManager(); } diff --git a/tests/integration/Doctrine/EventListeners/ValidationTest.php b/tests/integration/Doctrine/EventListeners/ValidationTest.php index 62085906af..776a8229e8 100644 --- a/tests/integration/Doctrine/EventListeners/ValidationTest.php +++ b/tests/integration/Doctrine/EventListeners/ValidationTest.php @@ -8,6 +8,7 @@ use MailPoet\Doctrine\EntityManagerFactory; use MailPoet\Doctrine\EventListeners\TimestampListener; use MailPoet\Doctrine\EventListeners\ValidationListener; use MailPoet\Doctrine\ValidationException; +use MailPoet\Doctrine\Validator\ValidatorFactory; use MailPoet\WP\Functions as WPFunctions; use MailPoetVendor\Doctrine\Common\Cache\ArrayCache; @@ -70,8 +71,9 @@ class ValidationTest extends \MailPoetTest { $configuration->setMetadataDriverImpl($metadata_driver); $configuration->setMetadataCacheImpl(new ArrayCache()); + $validator_factory = new ValidatorFactory($annotation_reader_provider); $timestamp_listener = new TimestampListener($this->wp); - $validation_listener = new ValidationListener(); + $validation_listener = new ValidationListener($validator_factory->createValidator()); $entity_manager_factory = new EntityManagerFactory($this->connection, $configuration, $timestamp_listener, $validation_listener); return $entity_manager_factory->createEntityManager(); } diff --git a/tests/integration/Doctrine/Types/JsonTypesTest.php b/tests/integration/Doctrine/Types/JsonTypesTest.php index 3081ba735b..e655b496ac 100644 --- a/tests/integration/Doctrine/Types/JsonTypesTest.php +++ b/tests/integration/Doctrine/Types/JsonTypesTest.php @@ -8,6 +8,7 @@ use MailPoet\Doctrine\ConfigurationFactory; use MailPoet\Doctrine\EntityManagerFactory; use MailPoet\Doctrine\EventListeners\TimestampListener; use MailPoet\Doctrine\EventListeners\ValidationListener; +use MailPoet\Doctrine\Validator\ValidatorFactory; use MailPoet\Test\Doctrine\Types\JsonEntity; use MailPoet\WP\Functions as WPFunctions; use MailPoetVendor\Doctrine\Common\Cache\ArrayCache; @@ -160,8 +161,9 @@ class JsonTypesTest extends \MailPoetTest { $configuration->setMetadataDriverImpl($metadata_driver); $configuration->setMetadataCacheImpl(new ArrayCache()); + $validator_factory = new ValidatorFactory($annotation_reader_provider); $timestamp_listener = new TimestampListener($this->wp); - $validation_listener = new ValidationListener(); + $validation_listener = new ValidationListener($validator_factory->createValidator()); $entity_manager_factory = new EntityManagerFactory($this->connection, $configuration, $timestamp_listener, $validation_listener); return $entity_manager_factory->createEntityManager(); }