Expressive 3!

Yesterday, we tagged and released Expressive 3!

Expressive 3 provides a middleware microframework.

Create a new Expressive application using Composer:

$ composer create-project zendframework/zend-expressive-skeleton

The installer will prompt you for your choice of:

  • Initial application architecture (minimal, flat, modular)
  • Which dependency injection container you would like to use.
  • Which routing library you would like to use.
  • Which templating library you would like to use, if any.
  • Which error handling library you would like to use, if any.

From there, it creates a new project for you, and allows you to get started
developing immediately.

You can read more in our quick start,
and may want to check out our command line tooling
to see what we provide to make development even faster for you!

What are the features?

Expressive 3 embraces modern PHP, and requires PHP 7.1 or higher. Strong
type-hinting, including return type hints, make both our job and your job
easier and more predictable. The ability to use all modern PHP features helps us
deliver a solid base for your application.

Expressive 3 provides full support for the PSR-15 (Middleware and Request
Handlers) standard
. We believe strongly
in supporting standards, to the extent that this release also drops direct
support for the "double-pass" middleware style

we have supported since version 1.0

Expressive 3 massively refactors its internals as well. In fact, the majority of
the code in the zend-expressive package was removed, moved to other existing
packages where it had a better semantic affiliation1,
or extracted to new packages2. This base
package now mainly handles coordinating collaborators and providing a
user-friendly interface to creating your application pipeline and routes.3

Expressive 3 provides more command line tooling and tooling improvements in
order to make developing your application easier. We added a command for
creating factories for existing classes (factory:create).4
The middleware:create command now creates a factory for the
middleware generated. We added support for creating request handlers5,
complete with factory generation and registration, as well as template support.6

Finally, we recognize that Expressive has changed massively between versions 1
and 3, while simultaneously keeping its primary API stable and unchanged.
However, to help users find the information they need for the version they run,
we have rolled out versioned documentation, with each version providing only
information specific to its release cycle:

The most recent version will always be present in the primary navigation, with
links to other versions present as well.

New components!

We have several new components that provide features for Expressive — or
any PSR-15 framework you may be using! These include:

We have a number of other packages in the works around authentication,
authorization, and data validation that we will be releasing in the coming weeks
and months; stay tuned for announcements!

What about upgrading?

We have prepared a migration document
that covers new features, removed features, and a list of all changes.

Additionally, we have provided migration tooling
to aid you in your migration from version 2 to version 3. The tool will not
necessarily give you a fully running application
, but it will take care of
the majority of the changes necessary to bump your application to version 3,
including setting up appropriate dependencies, and updating your bootstrapping
files to conform to the new skeleton application structure.

If you need assistance, you can find community help:

What’s next?

We have been working on a number of API-related modules for Expressive (and any
PSR-15 applications) since last summer, with a number of components already
completed, and others close to completion. We plan to finalize these in the next
few months.

Thank You!

We extend a hearty thank you to everyone who tested the various pre-releases and
provided feedback. Additionally, we are singling out the following individuals
who provided significant contributions to the Expressive 3 project:

  • Enrico Zimuel provided a ton of feedback and
    critique during the design phase, and was a driving force behind many of the
    API usability decisions.

  • Rob Allen did a workshop at SunshinePHP, right as we
    dropped our initial alpha releases, and provided feedback and testing for much
    of our tooling additions.

  • Frank Brückner provided ongoing feedback
    and review of pull requests, primarily around documentation; he is also
    responsible for a forthcoming rewrite of our documentation theme to make it
    more responsive and mobile-friendly.

  • Daniel Gimenes provided feedback and ideas as
    we refactored zend-stratigility; he is the one behind package-level utility
    functions such as ZendStratigilitydoublePassMiddleware(),
    ZendStratigilitypath(), and more.

  • Witold Wasiczko provided the majority of the
    rewrite of zend-stratigility for version 3. He can be celebrated for removing
    over half the code from that repository!

In addition to these people, I want to extend a personal thank you to the
following people:

  • Geert Eltink has helped maintain Expressive v2, and
    particularly the various routers and template engines, making them ready for
    v3 and testing continually. As a maintainer, I was able to rely on him to take
    care of merges as we finalized the releases, and was pleasantly surprised to
    wake up to new releases several times when he fixed critical issues in our
    alpha and RC releases.

  • Michał Bundyra provided a constant stream of
    pull requests related to quality assurance (including ongoing work on our phpcs
    extension!), as well as critical review of incoming patches. He spearheaded
    important work in the refactoring process, including changes to how we handle
    response prototypes, and critical fixes in our routers to address issues with
    how we detect allowed methods for path route matches. We synced each and every
    single day, often arguing, but always coming to consensus and plowing on.

If you get a chance, reach out to these contributors and thank them for the


  • 0: The Expressive ecosystem makes
    use of many other standards as well, including
    PSR-7 HTTP Messages,
    PSR-11 Container, and
    PSR-13 HTTP Links.

  • 1: As an example, the routing,
    dispatch, and "implicit methods" middleware were all moved to the
    package, as they each work with the router and route results.

  • 2: Request generation, application
    dispatch, and response emission were all moved to a new package,

  • 3: These refactors led to a net
    removal of code across the board, vastly simplifying the internals. This
    will lead to ease of maintenance, greater stability, and, based on benchmarks
    we’ve been performing, 10% better performance and less system resource usage.

  • 4: factory:create uses PHP’s
    Reflection API in order to determine what dependencies are in place in order to
    generate a factory class; it also registers the class and factory with the

  • 5: In previous Expressive versions,
    we referred to "actions", which were any middleware that returned a response
    instead of delegating to another layer of the application. PSR-15 calls such
    classes request handlers. Our tooling provides an action:create command,
    however, for those who prefer the "action" verbiage.

  • 6: The command creates a template
    named after the handler created; it uses the root namespace of the class to
    determine where to put it in the filesystem. Additionally, it alters the
    generated request handler to render the template into a zend-diactoros

Source: Zend feed