initContainer(); $this->initAutoloads(); $this->initPreloads(); } protected function initContainer(): void { $this->container = (new ContainerBuilder())->build(); } /** * Run an application runner. * * @param $className A runner class name. * @param $params Runner parameters. Will be passed to a runner's constructor. */ public function run(string $className, ?RunnerParams $params = null): void { if (!$className || !class_exists($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()->createWith($className, [ 'params' => $params ?? RunnerParams::fromNothing(), ]); if (!$runner instanceof Runner) { die("Class should implement Runner interface."); } $runner->run(); } /** * 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(): void { $autoload = $this->getInjectableFactory()->create(Autoload::class); $autoload->register(); } /** * Initialize services that has the 'preload' parameter. */ protected function initPreloads(): void { 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): void { $this->getClientManager()->setBasePath($basePath); } /** * Setup the system user. The system user is used when no user is logged in. */ public function setupSystemUser(): void { $this->getApplicationUser()->setupSystemUser(); } }