Нет описания

ConfigurationFactory.php 2.8KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. <?php
  2. namespace MailPoet\Doctrine;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\Doctrine\Annotations\AnnotationReaderProvider;
  5. use MailPoetVendor\Doctrine\Common\Cache\ArrayCache;
  6. use MailPoetVendor\Doctrine\Common\Proxy\AbstractProxyFactory;
  7. use MailPoetVendor\Doctrine\ORM\Configuration;
  8. use MailPoetVendor\Doctrine\ORM\Mapping\Driver\AnnotationDriver;
  9. use MailPoetVendor\Doctrine\Persistence\Mapping\Driver\PHPDriver;
  10. use MailPoetVendor\Doctrine\ORM\Mapping\UnderscoreNamingStrategy;
  11. class ConfigurationFactory {
  12. const ENTITY_DIR = __DIR__ . '/../Entities';
  13. const METADATA_DIR = __DIR__ . '/../../generated/doctrine-metadata';
  14. const PROXY_DIR = __DIR__ . '/../../generated/doctrine-proxies';
  15. const PROXY_NAMESPACE = 'MailPoetDoctrineProxies';
  16. /** @var bool */
  17. private $isDevMode;
  18. /** @var AnnotationReaderProvider */
  19. private $annotationReaderProvider;
  20. public function __construct(AnnotationReaderProvider $annotationReaderProvider, $isDevMode = null) {
  21. $this->isDevMode = $isDevMode === null ? WP_DEBUG : $isDevMode;
  22. $this->annotationReaderProvider = $annotationReaderProvider;
  23. }
  24. public function createConfiguration() {
  25. $configuration = new Configuration();
  26. $configuration->setNamingStrategy(new UnderscoreNamingStrategy(\CASE_LOWER, true));
  27. $this->configureMetadata($configuration);
  28. $this->configureProxies($configuration);
  29. $this->configureCache($configuration);
  30. return $configuration;
  31. }
  32. private function configureMetadata(Configuration $configuration) {
  33. $configuration->setClassMetadataFactoryName(TablePrefixMetadataFactory::class);
  34. // annotation reader exists only in dev environment, on production cache is pre-generated
  35. $annotationReader = $this->annotationReaderProvider->getAnnotationReader();
  36. if ($annotationReader) {
  37. $configuration->setMetadataDriverImpl(new AnnotationDriver($annotationReader, [self::ENTITY_DIR]));
  38. } else {
  39. // Should never be called but Doctrine requires having driver set
  40. $configuration->setMetadataDriverImpl(new PHPDriver([]));
  41. }
  42. // metadata cache (for production cache is pre-generated at build time)
  43. $isReadOnly = !$annotationReader;
  44. $metadataStorage = new PSRMetadataCache(self::METADATA_DIR, $isReadOnly);
  45. $configuration->setMetadataCache($metadataStorage);
  46. }
  47. private function configureProxies(Configuration $configuration) {
  48. $configuration->setProxyDir(self::PROXY_DIR);
  49. $configuration->setProxyNamespace(self::PROXY_NAMESPACE);
  50. $configuration->setAutoGenerateProxyClasses(
  51. $this->isDevMode
  52. ? AbstractProxyFactory::AUTOGENERATE_FILE_NOT_EXISTS
  53. : AbstractProxyFactory::AUTOGENERATE_NEVER
  54. );
  55. }
  56. private function configureCache(Configuration $configuration) {
  57. $cache = new ArrayCache();
  58. $configuration->setQueryCacheImpl($cache);
  59. $configuration->setResultCacheImpl($cache);
  60. }
  61. }