diff --git a/application/Espo/Core/Binding/DefaultBinding.php b/application/Espo/Core/Binding/DefaultBinding.php index 665e1ceea0..90e5d151df 100644 --- a/application/Espo/Core/Binding/DefaultBinding.php +++ b/application/Espo/Core/Binding/DefaultBinding.php @@ -48,6 +48,11 @@ class DefaultBinding 'entityManager' ); + $binder->bindService( + 'Espo\\ORM\\Metadata', + 'ormMetadata' + ); + $binder->bindService( 'Espo\\Core\\ORM\\EntityManager', 'entityManager' diff --git a/application/Espo/Core/DataManager.php b/application/Espo/Core/DataManager.php index 55e2861c1b..270f7dc02f 100644 --- a/application/Espo/Core/DataManager.php +++ b/application/Espo/Core/DataManager.php @@ -36,7 +36,7 @@ use Espo\Core\{ Utils\Util, Utils\Config, Utils\File\Manager as FileManager, - Utils\Metadata\OrmMetadata, + Utils\Metadata\OrmMetadataData, HookManager, Utils\Database\Schema\SchemaProxy, }; @@ -53,7 +53,7 @@ class DataManager protected $entityManager; protected $fileManager; protected $metadata; - protected $ormMetadata; + protected $ormMetadataData; protected $hookManager; protected $schemaProxy; @@ -64,7 +64,7 @@ class DataManager Config $config, FileManager $fileManager, Metadata $metadata, - OrmMetadata $ormMetadata, + OrmMetadataData $ormMetadataData, HookManager $hookManager, SchemaProxy $schemaProxy ) { @@ -72,7 +72,7 @@ class DataManager $this->config = $config; $this->fileManager = $fileManager; $this->metadata = $metadata; - $this->ormMetadata = $ormMetadata; + $this->ormMetadataData = $ormMetadataData; $this->hookManager = $hookManager; $this->schemaProxy = $schemaProxy; } @@ -157,9 +157,9 @@ class DataManager $metadata->init(true); - $ormData = $this->ormMetadata->getData(true); + $ormData = $this->ormMetadataData->getData(true); - $this->entityManager->setMetadata($ormData); + $this->entityManager->getMetadata()->updateData(); $this->updateCacheTimestamp(); diff --git a/application/Espo/Core/Loaders/EntityManager.php b/application/Espo/Core/Loaders/EntityManager.php index 856fb7b860..a990e0616a 100644 --- a/application/Espo/Core/Loaders/EntityManager.php +++ b/application/Espo/Core/Loaders/EntityManager.php @@ -31,25 +31,32 @@ namespace Espo\Core\Loaders; use Espo\Core\{ Utils\Config, - Utils\Metadata\OrmMetadata, InjectableFactory, ORM\EntityManager as EntityManagerService, ORM\RepositoryFactory, ORM\EntityFactory, ORM\Helper, + ORM\MetadataDataProvider, +}; + +use Espo\{ + ORM\Metadata as OrmMetadata, }; class EntityManager implements Loader { protected $config; protected $injectableFactory; - protected $ormMetadata; + protected $metadataDataProvider; - public function __construct(Config $config, InjectableFactory $injectableFactory, OrmMetadata $ormMetadata) - { + public function __construct( + Config $config, + InjectableFactory $injectableFactory, + MetadataDataProvider $metadataDataProvider + ) { $this->config = $config; $this->injectableFactory = $injectableFactory; - $this->ormMetadata = $ormMetadata; + $this->metadataDataProvider = $metadataDataProvider; } public function load() : EntityManagerService @@ -65,7 +72,6 @@ class EntityManager implements Loader $config = $this->config; $params = [ - 'metadata' => $this->ormMetadata->getData(), 'host' => $config->get('database.host'), 'port' => $config->get('database.port'), 'dbname' => $config->get('database.dbname'), @@ -81,8 +87,11 @@ class EntityManager implements Loader 'sslCipher' => $config->get('database.sslCipher'), ]; + $metadata = new OrmMetadata($this->metadataDataProvider); + $entityManager = $this->injectableFactory->createWith(EntityManagerService::class, [ 'params' => $params, + 'metadata' => $metadata, 'repositoryFactory' => $repositoryFactory, 'entityFactory' => $entityFactory, 'helper' => $helper, diff --git a/application/Espo/Core/Loaders/OrmMetadata.php b/application/Espo/Core/Loaders/OrmMetadata.php new file mode 100644 index 0000000000..4623bb10df --- /dev/null +++ b/application/Espo/Core/Loaders/OrmMetadata.php @@ -0,0 +1,50 @@ +entityManager = $entityManager; + } + + public function load() : Metadata + { + return $this->entityManager->getMetadata(); + } +} diff --git a/application/Espo/Core/ORM/EntityManager.php b/application/Espo/Core/ORM/EntityManager.php index 89fbacc18e..2acd86b533 100644 --- a/application/Espo/Core/ORM/EntityManager.php +++ b/application/Espo/Core/ORM/EntityManager.php @@ -32,12 +32,13 @@ namespace Espo\Core\ORM; use Espo\Entities\User; use Espo\Core\{ - Utils\Metadata as EspoMetadata, - HookManager, Utils\Util, }; -use Espo\ORM\EntityManager as BaseEntityManager; +use Espo\ORM\{ + EntityManager as BaseEntityManager, + Metadata, +}; class EntityManager extends BaseEntityManager { @@ -45,11 +46,12 @@ class EntityManager extends BaseEntityManager public function __construct( array $params, + Metadata $metadata, RepositoryFactory $repositoryFactory, EntityFactory $entityFactory, Helper $helper ) { - parent::__construct($params, $repositoryFactory, $entityFactory); + parent::__construct($params, $metadata, $repositoryFactory, $entityFactory); $this->helper = $helper; } diff --git a/application/Espo/Core/ORM/MetadataDataProvider.php b/application/Espo/Core/ORM/MetadataDataProvider.php new file mode 100644 index 0000000000..753aebe54b --- /dev/null +++ b/application/Espo/Core/ORM/MetadataDataProvider.php @@ -0,0 +1,48 @@ +ormMetadataData = $ormMetadataData; + } + + public function get() : array + { + return $this->ormMetadataData->getData(); + } +} diff --git a/application/Espo/Core/Utils/Database/Schema/Schema.php b/application/Espo/Core/Utils/Database/Schema/Schema.php index 170d7c2255..abc481ab87 100644 --- a/application/Espo/Core/Utils/Database/Schema/Schema.php +++ b/application/Espo/Core/Utils/Database/Schema/Schema.php @@ -41,7 +41,7 @@ use Espo\Core\{ Utils\File\Manager as FileManager, ORM\EntityManager, Utils\File\ClassParser, - Utils\Metadata\OrmMetadata, + Utils\Metadata\OrmMetadataData, Utils\Util, Utils\Database\Helper, Utils\Database\DBAL\Schema\Comparator, @@ -64,6 +64,8 @@ class Schema private $databaseHelper; + protected $ormMetadataData; + protected $fieldTypePaths = [ 'application/Espo/Core/Utils/Database/DBAL/FieldTypes', 'custom/Espo/Custom/Core/Utils/Database/DBAL/FieldTypes', @@ -92,7 +94,7 @@ class Schema FileManager $fileManager, EntityManager $entityManager, ClassParser $classParser, - OrmMetadata $ormMetadata + OrmMetadataData $ormMetadataData ) { $this->config = $config; $this->metadata = $metadata; @@ -110,7 +112,7 @@ class Schema $this->schemaConverter = new Converter($this->metadata, $this->fileManager, $this, $this->config); - $this->ormMetadata = $ormMetadata; + $this->ormMetadataData = $ormMetadataData; } protected function getConfig() @@ -203,7 +205,7 @@ class Schema $currentSchema = $this->getCurrentSchema(); - $metadataSchema = $this->schemaConverter->process($this->ormMetadata->getData(), $entityList); + $metadataSchema = $this->schemaConverter->process($this->ormMetadataData->getData(), $entityList); $this->initRebuildActions($currentSchema, $metadataSchema); diff --git a/application/Espo/Core/Utils/Metadata/OrmMetadata.php b/application/Espo/Core/Utils/Metadata/OrmMetadataData.php similarity index 99% rename from application/Espo/Core/Utils/Metadata/OrmMetadata.php rename to application/Espo/Core/Utils/Metadata/OrmMetadataData.php index 67a1eb9372..25e355db01 100644 --- a/application/Espo/Core/Utils/Metadata/OrmMetadata.php +++ b/application/Espo/Core/Utils/Metadata/OrmMetadataData.php @@ -39,7 +39,7 @@ use Espo\Core\{ Exceptions\Error, }; -class OrmMetadata +class OrmMetadataData { protected $data = null; diff --git a/application/Espo/ORM/EntityManager.php b/application/Espo/ORM/EntityManager.php index 6b7abdb3a9..3ae4a633cf 100644 --- a/application/Espo/ORM/EntityManager.php +++ b/application/Espo/ORM/EntityManager.php @@ -82,11 +82,15 @@ class EntityManager 'mysqli' => 'Mysql', ]; - public function __construct(array $params, RepositoryFactory $repositoryFactory, EntityFactory $entityFactory) - { + public function __construct( + array $params, + Metadata $metadata, + RepositoryFactory $repositoryFactory, + EntityFactory $entityFactory + ) { $this->params = $params; - $this->metadata = new Metadata(); + $this->metadata = $metadata; if (empty($this->params['platform'])) { if (empty($this->params['driver'])) { @@ -102,10 +106,6 @@ class EntityManager $this->params['platform'] = $this->driverPlatformMap[$this->params['driver']]; } - if (!empty($params['metadata'])) { - $this->setMetadata($params['metadata']); - } - $this->entityFactory = $entityFactory; $this->entityFactory->setEntityManager($this); @@ -372,16 +372,7 @@ class EntityManager return $this->queryBuilder; } - /** - * @deprecated - * @todo Remove. - */ - public function setMetadata(array $data) - { - $this->metadata->setData($data); - } - - public function getMetadata() + public function getMetadata() : Metadata { return $this->metadata; } diff --git a/application/Espo/ORM/Metadata.php b/application/Espo/ORM/Metadata.php index 5d6f7c4799..0ffa792844 100644 --- a/application/Espo/ORM/Metadata.php +++ b/application/Espo/ORM/Metadata.php @@ -32,20 +32,27 @@ namespace Espo\ORM; use InvalidArgumentException; /** - * Metadata of all entities. + * Metadata. */ class Metadata { protected $data; - public function __construct(array $data = []) + protected $dataProvider; + + public function __construct(MetadataDataProvider $dataProvider) { - $this->data = $data; + $this->data = $dataProvider->get(); + + $this->dataProvider = $dataProvider; } - public function setData(array $data) + /** + * Update data from the data provider. + */ + public function updateData() { - $this->data = $data; + $this->data = $this->dataProvider->get(); } /** diff --git a/application/Espo/ORM/MetadataDataProvider.php b/application/Espo/ORM/MetadataDataProvider.php new file mode 100644 index 0000000000..385c3aa58d --- /dev/null +++ b/application/Espo/ORM/MetadataDataProvider.php @@ -0,0 +1,38 @@ +