Version 5 supported

Kernel and Application

Together, the kernel and application provide bootstrapping and entrypoint to your project.

Kernel

The Kernel object provides a container for the various manifests, services, and components which a Silverstripe CMS application must have available in order for requests to be executed.

This can be accessed in user code via Injector

use SilverStripe\Core\Injector\Injector;
use SilverStripe\Core\Kernel;

$kernel = Injector::inst()->get(Kernel::class);
echo 'Current environment: ' . $kernel->getEnvironment();

Kernel services

Services accessible from this kernel include:

  • getContainer() -> Current Injector service
  • getThemeResourceLoader() -> ThemeResourceLoader Service for loading of discovered templates. Also used to contain nested theme sets such as the $default set for all root module /templates folders.
  • getEnvironment() -> String value for the current environment. One of 'dev', 'live' or 'test'

Several meta-services are also available from Kernel (which are themselves containers for other core services) but are not commonly accessed directly:

  • getClassLoader() -> ClassLoader service which handles the class manifest
  • getModuleLoader() -> Manifest service which handles module registration
  • getConfigLoader() -> ConfigLoader Service which assists with nesting of Config instances
  • getInjectorLoader() -> InjectorLoader Service which assists with nesting of Injector instances

Kernel nesting

As with Config and Injector the Kernel can be nested to safely modify global application state, and subsequently restore state. Unlike those classes, however, there is no ::unnest(). Instead you should call ->activate() on the kernel instance you would like to unnest to.

$oldKernel = Injector::inst()->get(Kernel::class);
try {
    // Injector::inst() / Config::inst() are automatically updated to the new kernel
    $newKernel = $oldKernel->nest();
    Config::modify()->set(Director::class, 'alternate_base_url', '/myurl');
} finally {
    // Any changes to config (or other application state) have now been reverted
    $oldKernel->activate();
}

Application

An Application represents a basic execution controller for the top level application entry point. The role of the application is to:

  • Control bootstrapping of a provided kernel instance
  • Handle errors raised from an application
  • Direct requests to the request handler, and return a valid response

HTTPApplication

The HTTPApplication provides a specialised application implementation for handling HTTP Requests. This class provides basic support for HTTP Middleware, such as ErrorControlChainMiddleware.

The index.php file in your web root contains the default application implementation. You can customise it as required.

use SilverStripe\Control\HTTPApplication;
use SilverStripe\Control\HTTPRequestBuilder;
use SilverStripe\Core\CoreKernel;
use SilverStripe\Core\Startup\ErrorControlChainMiddleware;

require __DIR__ . '/vendor/autoload.php';

// Build request and detect flush
$request = HTTPRequestBuilder::createFromEnvironment();

// Default application
$kernel = new CoreKernel(BASE_PATH);
$app = new HTTPApplication($kernel);
$app->addMiddleware(new ErrorControlChainMiddleware($app));
$response = $app->handle($request);
$response->output();

Custom application actions

If it's necessary to boot a Silverstripe CMS kernel and application, but not do any request processing, you can use the Application::execute() method to invoke a custom application entry point.

This may be necessary if using Silverstripe CMS code within the context of a non-Silverstripe CMS application.

For example, the below will setup a request, session, and current controller, but will leave the application in a "ready" state without performing any routing.

$request = CLIRequestBuilder::createFromEnvironment();
$kernel = new TestKernel(BASE_PATH);
$app = new HTTPApplication($kernel);
$app->execute($request, function (HTTPRequest $request) {
    // Start session and execute
    $request->getSession()->init();

    // Set dummy controller
    $controller = Controller::create();
    $controller->setRequest($request);
    $controller->pushCurrent();
    $controller->doInit();
}, true);