ConfigLoader::class, 'log' => LogLoader::class, 'fileManager' => FileManagerLoader::class, 'dataManager' => DataManagerLoader::class, 'metadata' => MetadataLoader::class, ]; public function __construct() { date_default_timezone_set('UTC'); $this->initContainer(); $this->initAutoloads(); $this->initPreloads(); } protected function initContainer() { $this->container = new Container(ContainerConfiguration::class, $this->loaderClassNames); } /** * Run a specific application runner. * You can find runner classes at `Espo\Core\ApplicationRunners`. */ public function run(string $className, ?object $params = null) { if (!$className) { $this->getLog()->error("Application runner '{$className}' does not exist."); return; } $class = new ReflectionClass($className); if ($class->getStaticPropertyValue('cli', false)) { if (substr(php_sapi_name(), 0, 3) !== 'cli') { die("Can be run only via CLI."); } } if ($class->getStaticPropertyValue('setupSystemUser', false)) { $this->setupSystemUser(); } $runner = $this->getInjectableFactory()->create($className); $runner->run($params); } /** * Whether an application is installed. */ public function isInstalled() : bool { $config = $this->getConfig(); if (file_exists($config->getConfigPath()) && $config->get('isInstalled')) { return true; } return false; } /** * Get a service container. */ public function getContainer() : Container { return $this->container; } protected function getInjectableFactory() : InjectableFactory { return $this->container->get('injectableFactory'); } protected function getApplicationUser() : ApplicationUser { return $this->container->get('applicationUser'); } protected function getLog() : Log { return $this->container->get('log'); } protected function getClientManager() : ClientManager { return $this->container->get('clientManager'); } protected function getMetadata() : Metadata { return $this->container->get('metadata'); } protected function getConfig() : Config { return $this->container->get('config'); } protected function initAutoloads() { $autoload = $this->getInjectableFactory()->create(Autoload::class); $autoload->register(); } /** * Initialize services that has the 'preload' parameter. */ protected function initPreloads() { foreach ($this->getMetadata()->get(['app', 'containerServices']) ?? [] as $name => $defs) { if ($defs['preload'] ?? false) { $this->container->get($name); } } } /** * Set a base path of an index file related to the application directory. Used for a portal. */ public function setClientBasePath(string $basePath) { $this->getClientManager()->setBasePath($basePath); } /** * Setup the system user. The system user is used when no user is logged in. */ public function setupSystemUser() { $this->getApplicationUser()->setupSystemUser(); } }