Tempest is still a work in progress. Visit our GitHub or Discord

Framework Bootstrap

Here's a short summary of what booting Tempest looks like.

  • Tempest boots using the \Tempest\Framework\Application\Kernel class, the first step is to build the container
  • Then there are bootstrap classes, each with an individual task. You find them in \Tempest\Framework\Application\Bootstraps
  • Two bootstraps (DiscoveryLocationBootstrap and DiscoveryBootstrap) are tasked with setting up and executing discovery, which is the mechanism that will scan the whole codebase, and automatically register classes, you can read about it in the next chapter.
  • The other bootstrap (ConfigBootstrap) is used for loading config. For now, loading config happens independent of discovery, but we plan on refactoring that.
  • When bootstrapping is completed, the kernel return a fully configured container, which can be used to boot an application.

Applications#

Tempest provides two applications: ConsoleApplication and HttpApplication. Their name already suggests the difference between the two. Here's how to boot an application:

  • As soon you've got a configured container object from the kernel, you can resolve a specific application from it: $application = $container->get(ConsoleApplication::class).
  • You can provide additional application-specific configuration and setup if needed.
  • Finally, you can call $application->run() to run it.

Because kernel bootstrap and application boot are two low-level framework concerns, Tempest offers a class that handles all these steps for you behind the scenes: \Tempest\Framework\Tempest.

This is the only line framework users should write to actually boot and run Tempest:

// For console applications:
Tempest::boot(getcwd())->console()->run();

// For HTTP applications:
Tempest::boot(__DIR__ . '/../')->http()->run();

Loading config#

  • ConfigBootstrap will scan all registered discovery locations, and search for a folder called Config/ within each location. All files with .php will be registered as config files
  • Discovery locations are determined based on composer. For example, your project root namespace is a discovery location (most likely called app or src). Another example is the Tempest vendor code itself, living in vendor/tempest. For now, it's sufficient to know that Tempest will detect all project code for you based on composer, and scan everything that's contains tempest code.
  • Whenever config files are detected, they are registered as singletons in the container. That means that every config file is available to be injected in any class.

A config file would look something like this:

// app/Config/database.php

<?php

use Tempest\Database\DatabaseConfig;
use Tempest\Database\Drivers\SQLiteDriver;

return new DatabaseConfig(
    driver: new SQLiteDriver(
        path: __DIR__ . '/../database.sqlite',
    ),
);

Note that project-level config files are optional, Tempest loads default implementations if there's no user-specific config file. These default config files are located in src/Tempest/Framework/Config/. Whenever you create a new config class on the framework level, you should also add a corresponding config file for it in this location.