6.0.0-alpha12
7/4/25
Last Modified 4/14/22 by Ralf Lang

Bootstrapping an environment

Horde's registry and bootstrapping predates composer, composer autoloader and most modern conventions. It is not helped by being super flexible in almost every aspect.
Bootstrapping is the order in which (a necessary part of) the Horde application environment is set up before actually running useful code. The current process is hard to understand and reason about.
With modern standards and concepts, a basic service or app need not carry around baggage from assumptions that may be entire irrelevant.

For example, the horde base app

H5/Classic

Not necessarily in that order. Even getting the order right is non-trivial.

- Calling the core from the page, service endpoint or CLI
- setting up preliminary autoloading
- Setting up some fundamental constants, including guessing some paths.
- Lots of chicken/egg things
- setting up a preliminary (opinionated) selection of Dependency Injection keys for the Horde\Injector DI
- setting up all sorts of scary globals
- finding installed applications
- finding config for installed applications
- finding out if or if not snippets matching the current domain vhost should be applied
- Setting up even more autoloading for the current app
- Setting up filesystem locations and web-visible paths (possibly domains, too) for apps and the horde base app, themes, javascript, templates ...
- Session handling, based on config
- determine if the current session is administrative or has a certain permission
- Language handling
- Setting up fundamental services like auth, logging
- Everything happens live on request

Standalone/Web

Three stages:

Early stage

- Web server calls entrypoint.
- Composer autoloader first. One load to rule them all.
- Feed the DI with the bare minimum for routing purposes. (Less is better)
- Load cached list of relevant apps/services that expose routes. If it does not exist, assemble it.
- some primitive early error handling

Routing stage

- Load routes
- Assemble request object
- match request with routes
- call stack associated with route
- Perform PSR7/15 dance
- handle route-not-found / default route

Middleware/Controller stage

- authentication, if they want it
- permission handling, if they want it
- prefs handling, if they want it
- login to backing services, if they want it
- handle any errors

Modern/CLI

TBD