. * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU Affero General Public License version 3. * * In accordance with Section 7(b) of the GNU Affero General Public License version 3, * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ namespace Espo\ORM\Value; use Espo\ORM\Entity; use RuntimeException; class GeneralValueFactory { /** @var array */ private array $factoryCache = []; public function __construct(private ValueFactoryFactory $valueFactoryFactory) {} /** * Whether a field value object can be created from an entity. */ public function isCreatableFromEntity(Entity $entity, string $field): bool { $factory = $this->getValueFactory($entity->getEntityType(), $field); if (!$factory) { return false; } return $factory->isCreatableFromEntity($entity, $field); } /** * Create a field value object from an entity. */ public function createFromEntity(Entity $entity, string $field): object { $factory = $this->getValueFactory($entity->getEntityType(), $field); if (!$factory) { $entityType = $entity->getEntityType(); throw new RuntimeException("No value-object factory for '{$entityType}.{$field}'."); } /** @var ValueFactory */ return $factory->createFromEntity($entity, $field); } private function getValueFactory(string $entityType, string $field): ?ValueFactory { $key = $entityType . '_' . $field; if (!array_key_exists($key, $this->factoryCache)) { $this->factoryCache[$key] = $this->getValueFactoryNoCache($entityType, $field); } return $this->factoryCache[$key]; } private function getValueFactoryNoCache(string $entityType, string $field): ?ValueFactory { if (!$this->valueFactoryFactory->isCreatable($entityType, $field)) { return null; } return $this->valueFactoryFactory->create($entityType, $field); } }