======================
Architectural Overview
======================

Flow is a PHP-based application framework. It is especially well-suited
for enterprise-grade applications and explicitly supports Domain-Driven
Design, a powerful software design philosophy. Convention over
configuration, Test-Driven Development, Continuous Integration and an
easy-to-read source code are other important principles we follow for
the development of Flow.

Although we created Flow as the foundation for the Neos Content
Management System, its approach is general enough to be useful as a
basis for any other PHP application. We're happy to share the Flow
framework with the whole PHP community and are looking forward to the
hundreds of new features and enhancements contributed as packages by
other enthusiastic developers.

This reference describes all features of Flow and provides you with
in-depth information. If you'd like to get a feeling for Flow and get
started quickly, we suggest that you try out our Getting Started
tutorial first.

System Parts
============

The Flow framework is composed of the following submodules:

* The *Flow Bootstrap* takes care of configuring and initializing the
  whole framework.

* The *Package* Manager allows you to download, install, configure and
  uninstall packages.

* The *ObjectManagement* is in charge of building, caching and combining
  objects.

* The *Configuration* framework reads and cascades various kinds of
  configuration from different sources and provides access to it.

* The *ResourceManagement* module contains functions for publishing,
  caching, securing and retrieving resources.

* The *HTTP* component is a standards-compliant implementation of a
  number of RFCs around HTTP, Cookies, content negotiation and more.
  It is based on the PHP-FIG PSR-15 and PSR-7 specifications.

* The *MVC* framework takes care of requests and responses and provides
  you with a powerful, easy-to use Model-View-Controller
  implementation.

* The *Cli* module provides a very easy way to implement CLI commands
  using Flow, including built-in help based on code documentation.

* The *Cache* framework provides different kinds of caches with can be
  combined with a selection of cache backends.

* The *Error* module handles errors and exceptions and provides utility
  classes for this purpose.

* The *Log* module provides simple but powerful means to log any kind
  of event or signal into different types of backends.

* The *Signal Slot* module implements the event-driven concept of
  signals and slots through AOP aspects.

* The *Validation* module provides a validation and filtering framework
  with built-in rules as well as support for custom validation of any
  object.

* The *Property* module implements the concept of property editors and
  is used for setting and retrieving object properties.

* The *Reflection* API complements PHP's built-in reflection support by
  advanced annotation handling and a cached reflection service.

* The *AOP* framework enables you to use the powerful techniques of
  Aspect Oriented Programming.

* The *Persistence* module allows you to transparently persist your
  objects following principles of *Domain Driven Design*.

* The *Security* framework enforces security policies and provides an
  API for managing those.

* The *Session* framework takes care of session handling and storing
  session information in different backends

* The *I18n* service manages languages and other regional settings
  and makes them accessible to other packages and Flow sub packages.

* The *Utility* module is a library of useful general-purpose functions
  for file handling, algorithms, environment abstraction and more.

If you are overwhelmed by the amount of information in this reference,
just keep in mind that you don't need to know all of it to write your
own Flow packages. You can always come back and look up a specific
topic once you need to know about it - that's what references are for.

But even if you don't need to know everything, we recommend that you get
familiar with the concepts of each module and read the whole manual.
This way you make sure that you don't miss any of the great features
Flow provides and hopefully feel inspired to produce clean and
easy-maintainable code.
