silverstripe-framework/docs/en/02_Developer_Guides/16_Execution_Pipeline/index.md
Ingo Schommer fa3c5e6fea
DOCS Clearer sysadmin guidance for "packaging" (#9960)
* DOCS Clearer sysadmin guidance for "packaging"

We have all kinds of fun fallbacks that attempt to create supporting files in production environments.
The latest point of contention is dev/build automatically creating files in .graphql/ and public/_graphql/
if those don't exist. That should be regarded as a last resort option to allow introduction of GraphQL v4 in the CMS 4.x release line.
At least since CMS 4.1, we need some form of "packaging" for generated files (public/_resources),
or committing these into the codebase, so let's call that out for anyone running CMS infra.

* Add trailing slash

Co-authored-by: Aaron Carlino <unclecheese@leftandmain.com>
2021-06-02 10:59:42 +12:00

4.8 KiB

title summary icon
Execution pipeline An overview of the steps involved in delivering a SilverStripe web page. route

Execution Pipeline

Introduction

In order to transform a HTTP request or a commandline exeuction into a response, SilverStripe needs to boot its core and run through several stages of processing.

Request Rewriting

The first step in most environments is a rewrite of a request path into parameters passed to a PHP script. This allows writing friendly URLs instead of linking directly to PHP files. The implementation depends on your web server; we'll show you the most common one here: Apache with mod_rewrite. Check our installation guides on how other web servers like IIS or nginx handle rewriting.

The standard SilverStripe project ships with a .htaccess file in your webroot for this purpose. By default, requests will be passed through for files existing on the filesystem. Some access control is in place to deny access to potentially sensitive files in the webroot, such as YAML configuration files. If no file can be directly matched, control is handed off to index.php.

Bootstrap

The constants.php file is included automatically in any project which requires silverstripe/framework. This is included automatically when the composer vendor/autoload.php is included, and performs its tasks silently in the background.

  • Tries to locate an .env configuration file in the webroot.
  • Sets constants based on the filesystem structure (e.g. BASE_URL, BASE_PATH and TEMP_PATH)

All requests go through index.php, which sets up the core Kernel and HTTPApplication objects. See App Object and Kernel for details on this. The main process follows:

  • Include autoload.php
  • Construct HTTPRequest object from environment.
  • Construct a Kernel instance
  • Construct a HTTPApplication instance
  • Add any necessary middleware to this application
  • Pass the request to the application, and request a response

While you usually don't need to modify the bootstrap on this level, some deeper customizations like adding your own manifests or a performance-optimized routing might require it. An example of this can be found in the "staticpublisher" module.

Routing and Request Handling

The index.php script relies on Director to work out which controller should handle this request. It parses the URL, matching it to one of a number of patterns, and determines the controller, action and any argument to be used (Routing).

  • Creates a HTTPRequest object containing all request and environment information
  • The session holds an abstraction of PHP session
  • Instantiates a controller object
  • The Injector is first referenced, and asks the registered RequestFilter to pre-process the request object (see below)
  • The Controller executes the actual business logic and populates an HTTPResponse
  • The Controller can optionally hand off control to further nested controllers
  • The Controller optionally renders a response body through SSViewer templates
  • The RequestProcessor is called to post-process the request to allow further filtering before content is sent to the end user
  • The response is output to the client

See App Object and Kernel for details.

Request Preprocessing and Postprocessing

The framework provides the ability to hook into the request both before and after it is handled to allow binding custom logic. This can be used to transform or filter request data, instantiate helpers, execute global logic, or even short-circuit execution (e.g. to enforce custom authentication schemes). The "Request Filters" documentation shows you how.

Flushing Manifests

If a ?flush=1 query parameter is added to a URL, a call to flush() will be triggered on any classes that implement the Flushable interface. This enables developers to clear manifest caches, for example when adding new templates or PHP classes. Note that you need to be in dev mode or logged-in as an administrator for flushing to take effect.

[CHILDREN]