silverstripe-framework/docs/en/02_Developer_Guides/16_Execution_Pipeline/02_Manifests.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.2 KiB

title summary
Manifests Manage caches of file path maps and other expensive information

Manifests

Purpose

Manifests help to cache information which is too expensive to generate on each request. Some manifests generate maps, e.g. class names to filesystem locations. Others store aggregate information like nested configuration graphs.

Manifests are immutable for a given revision of the codebase, and hence should be packaged during deployment. Object Caching and Partial Template Caching are examples of mutable caches outside of manifests, which need to be generated and expired during runtime.

Storage

By default, manifests are serialised and cached via a cache generated by the ManifestCacheFactory. This can be customised via SS_MANIFESTCACHE environment variable to point to either another CacheFactory or CacheInterface implementor.

Traversing the Filesystem

Since manifests usually extract their information from files in the webroot, they require a powerful traversal tool: FileFinder. The class provides filtering abilities for files and folders, as well as callbacks for recursive traversal. Each manifest has its own implementation, for example ManifestFileFinder, adding more domain specific filtering like including themes, or excluding tests.

PHP Class Manifest

The ClassManifest builds a manifest of all classes, interfaces and some additional items present in a directory, and caches it.

It finds the following information:

  • Class and interface names and paths
  • All direct and indirect descendants of a class
  • All implementors of an interface
  • All module configuration files

The gathered information can be accessed through ClassLoader::inst(), as well as ClassInfo. Some useful commands of the ClassInfo API:

  • ClassInfo::subclassesFor($class): Returns a list of classes that inherit from the given class
  • ClassInfo::ancestry($class): Returns the passed class name along with all its parent class names
  • ClassInfo::implementorsOf($interfaceName): Returns all classes implementing the passed in interface

In the absence of a generic module API, it is also the primary way to identify which modules are installed, through ClassManifest::getModules(). A module is defined as a toplevel folder in the webroot which contains either a _config.php file, or a _config/ folder. Modules can be specifically excluded from manifests by creating a blank _manifest_exclude file in the module folder.

By default, the finder implementation will exclude any classes stored in files within a tests/ folder, unless tests are executed.

Theme Manifests

The ThemeManifest class builds a manifest of all templates present in a directory, in both modules and themes.

Templates in tests/ folders are automatically excluded. The chapter on template inheritance provides more details on its operation.

Config Manifest

The ConfigManifest loads builds a manifest of configuration items, for both PHP and YAML. It also takes care of ordering and merging configuration fragments. The chapter on configuration has more details.

Flushing

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.