initContainer(); $this->initAutoloads(); $this->initPreloads(); } protected function initContainer(): void { /** @var Container $container */ $container = (new ContainerBuilder())->build(); $this->container = $container; } /** * Run an application runner. * * @param class-string $className A runner class name. * @param ?RunnerParams $params Runner parameters. */ public function run(string $className, ?RunnerParams $params = null): void { $runnerRunner = $this->getInjectableFactory()->create(RunnerRunner::class); try { $runnerRunner->run($className, $params); } catch (RunnerException $e) { die($e->getMessage()); } } /** * Whether the application is installed. */ public function isInstalled(): bool { return $this->getConfig()->get('isInstalled'); } /** * Get the service container. */ public function getContainer(): Container { return $this->container; } protected function getInjectableFactory(): InjectableFactory { return $this->container->getByClass(InjectableFactory::class); } protected function getApplicationUser(): ApplicationUser { return $this->container->getByClass(ApplicationUser::class); } protected function getClientManager(): ClientManager { return $this->container->getByClass(ClientManager::class); } protected function getMetadata(): Metadata { return $this->container->getByClass(Metadata::class); } protected function getConfig(): Config { return $this->container->getByClass(Config::class); } 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); } /** * Set up the system user. The system user is used when no user is logged in. */ public function setupSystemUser(): void { $this->getApplicationUser()->setupSystemUser(); } }