In This Article

Containers

Expressive promotes and advocates the usage of Dependency Injection/Inversion of Control (also referred to as DI — or DIC — and IoC, respectively) containers when writing your applications. These should be used for the following:

  • Defining application dependencies: routers, template engines, error handlers, even the Application instance itself.

  • Defining middleware and related dependencies.

The application skeleton wires together dependency configuration, which is then used to create a container. This in turn is used to seed a Zend\Expressive\MiddlewareContainer for purposes of retrieving middleware for the Application instance (via another intermediary, Zend\Expressive\MiddlewareFactory). When the application is ready to execute middleware or a handler, it will fetch it from the container. This approach encourages the idea of defining middleware-specific dependencies, and factories for ensuring they are injected.

To facilitate this and allow you as a developer to choose the container you prefer, zend-expressive typehints against PSR-11 Container, and throughout this manual, we attempt to show using a variety of containers in examples.

At this time, we document support for the following specific containers:

Service Names

We recommend using fully-qualified class names whenever possible as service names, with one exception: in cases where a service provides an implementation of an interface used for typehints, use the interface name.

Following these practices encourages the following:

  • Consumers have a reasonable idea of what the service should return.
  • Using interface names as service names promotes re-use and substitution.

In a few cases, we define "virtual service" names. These are cases where there is no clear typehint to follow. For example, we may want to imply specific configuration is necessary; Whoops requires specific configuration to work correctly with Expressive, and thus we do not want a generic service name for it. We try to keep these to a minimum, however.

Found a mistake or want to contribute to the documentation? Edit this page on GitHub!