zend-expressive 3.0.0rc5
This release contains a breaking change.
This release updates to zend-expressive-router 3.0.0rc5, which renames Zend\Expressive\Router\Middleware\PathBasedRoutingMiddleware to Zend\Expressive\Router\RouteCollector, and drops its extension of RouteMiddleware. This was done to prevent confusion between the two route middleware implementations in the final release, and because the primariy duty of the (newly renamed) RouteCollector is to produce and inject Route instances into the composed router.
This release of zend-expressive required one change to comply: Zend\Expressive\Application now composes a RouteCollector instead of a PathBasedRoutingMiddleware instance.
Below is a cumulative list of changes for the 3.0.0 release, including all changes from previous alpha and RC releases. References to PathBasedRoutingMiddleware have been updated to reference RouteCollector or RouteMiddleware based on context:
Added
-
#543 adds support for the final PSR-15 interfaces, and explicitly depends on psr/http-server-middleware.
-
#538 adds scalar and return type hints to methods wherever possible.
-
#562 adds the class
Zend\Expressive\Response\ServerRequestErrorResponseGenerator, and maps it to theZend\Expressive\Container\ServerRequestErrorResponseGeneratorFactory. The class generates an error response when an exeption occurs producing a server request instance, and can be optionally templated. -
#543 adds a new class,
Zend\Expressive\MiddlewareContainer. The class decorates a PSR-11ContainerInterface, and adds the following behavior:- If a class is not in the container, but exists,
has()will returntrue. - If a class is not in the container, but exists,
get()will attempt to instantiate it, caching the instance locally if it is valid. - Any instance pulled from the container or directly instantiated is tested. If it is a PSR-15
RequestHandlerInterface, it will decorate it in a zend-stratigilityRequestHandlerMiddlewareinstance. If the instance is not a PSR-15MiddlewareInterface, the container will raise aZend\Expressive\Exception\InvalidMiddlewareException.
- If a class is not in the container, but exists,
-
#543 adds a new class,
Zend\Expressive\MiddlewareFactory. The class composes aMiddlewareContainer, and exposes the following methods:callable(callable $middleware) : CallableMiddlewareDecoratorhandler(RequestHandlerInterface $handler) : RequestHandlerMiddlewarelazy(string $service) : LazyLoadingMiddlewareprepare($middleware) : MiddlewareInterface: accepts a string service name, callable,RequestHandlerInterface,MiddlewareInterface, or array of such values, and returns aMiddlewareInterface, raising an exception if it cannot determine what to do.pipeline(...$middleware) : MiddlewarePipe: passes each argument toprepare(), and the result toMiddlewarePipe::pipe(), returning the pipeline when complete.
-
#543 adds the following factory classes, each within the
Zend\Expressive\Containernamespace:ApplicationPipelineFactory: creates and returns aZend\Stratigility\MiddlewarePipeto use as the application middleware pipeline.DispatchMiddlewareFactory: creates and returns aZend\Expressive\Router\DispatchMiddlewareinstance.EmitterFactory: creates and returns aZend\HttpHandlerRunner\Emitter\EmitterStackinstance composing anSapiEmitterfrom that same namespace as the only emitter on the stack. This is used as a dependency for theZend\HttpHandlerRunner\RequestHandlerRunnerservice.MiddlewareContainerFactory: creates and returns aZend\Expressive\MiddlewareContainerinstance decorating the PSR-11 container passed to the factory.MiddlewareFactoryFactory: creates and returns aZend\Expressive\MiddlewareFactoryinstance decorating aMiddlewareContainerinstance as pulled from the container.RequestHandlerRunnerFactory: creates and returns aZend\HttpHandlerRunner\RequestHandlerRunnerinstance, using the servicesZend\Expressive\Application,Zend\HttpHandlerRunner\Emitter\EmitterInterface,Zend\Expressive\ServerRequestFactory, andZend\Expressive\ServerRequestErrorResponseGenerator.ServerRequestFactoryFactory: creates and returns acallablefactory for generating a PSR-7ServerRequestInterfaceinstance; this returned factory is a dependency for theZend\HttpHandlerRunner\RequestHandlerRunnerservice.ServerRequestErrorResponseGeneratorFactory: creates and returns acallablethat accepts a PHPThrowablein order to generate a PSR-7ResponseInterfaceinstance; this returned factory is a dependency for theZend\HttpHandlerRunner\RequestHandlerRunnerservice, which uses it to generate a response in the scenario that theServerRequestFactoryis unable to create a request instance.
-
#551 and #554 add the following constants under the
Zend\Expressivenamespace:DEFAULT_DELEGATEcan be used to refer to the formerDefaultDelegateFQCN service, and maps to theZend\Expressive\Handler\NotFoundHandlerservice.IMPLICIT_HEAD_MIDDLEWAREcan be used to refer to the formerZend\Expressive\Middleware\ImplicitHeadMiddlewareservice, and maps to theZend\Expressive\Router\Middleware\ImplicitHeadMiddlewareservice.IMPLICIT_OPTIONS_MIDDLEWAREcan be used to refer to the formerZend\Expressive\Middleware\ImplicitOptionsMiddlewareservice, and maps to theZend\Expressive\Router\Middleware\ImplicitOptionsMiddlewareservice.NOT_FOUND_MIDDLEWAREcan be used to refer to the formerZend\Expressive\Middleware\NotFoundMiddlewareservice, and maps to theZend\Expressive\Handler\NotFoundHandlerservice.
Changed
-
#579 updates the version constraint for zend-expressive-router to use 3.0.0rc4 or later.
-
#579 updates the version constraint for zend-stratigility to use 3.0.0rc1 or later.
-
#543 adds a dependency on zendframework/zend-httphandlerrunner 1.0.0
-
#542 modifies the
composer.jsonto no longer suggest the pimple/pimple package, but rather the zendframework/zend-pimple-config package. -
#542 modifies the
composer.jsonto no longer suggest the aura/di package, but rather the zendframework/zend-auradi-config package. -
#543 updates the
Zend\Expressive\ConfigProviderto reflect new, removed, and updated services and their factories. -
#554 updates the
ConfigProviderto add entries for the following constants as follows:IMPLICIT_HEAD_MIDDLEWAREaliases to theZend\Expressive\Router\Middleware\ImplicitHeadMiddlewareservice.IMPLICIT_OPTIONS_MIDDLEWAREaliases to theZend\Expressive\Router\Middleware\ImplicitOptionsMiddlewareservice.
-
#543 updates
Zend\Expressive\Handler\NotFoundHandlerto implement the PSR-15RequestHandlerInterface. AsZend\Expressive\Middleware\NotFoundHandleris removed,Zend\Expressive\Container\NotFoundHandlerFactoryhas been re-purposedto create an instance ofZend\Expressive\Handler\NotFoundHandler. -
#561 modifies the
Zend\Expressive\Handler\NotFoundHandlerto compose a response factory instead of a response prototype. -
#543 refactors
Zend\Expressive\Applicationcompletely.The class no longer extends
Zend\Stratigility\MiddlewarePipe, and instead implements the PSR-15MiddlewareInterfaceandRequestHandlerInterface.It now requires the following dependencies via constructor injection, in the following order:
Zend\Expressive\MiddlewareFactoryZend\Stratigility\MiddlewarePipe; this is the pipeline representing the application.Zend\Expressive\Router\RouteCollectorZend\HttpHandlerRunner\RequestHandlerRunner
It removes all "getter" methods (as detailed in the "Removed" section of this release), but retains the following methods, with the changes described below. Please note: in most cases, these methods accept the same arguments as in the version 2 series, with the exception of callable double-pass middleware (these may be decorated manually using
Zend\Stratigility\doublePassMiddleware()), and http-interop middleware (no longer supported; rewrite as PSR-15 middleware).-
pipe($middlewareOrPath, $middleware = null) : voidpasses its arguments to the composedMiddlewareFactory'sprepare()method; if two arguments are provided, the second is passed to the factory, and the two together are passed toZend\Stratigility\path()in order to decorate them to work as middleware. The prepared middleware is then piped to the composedMiddlewarePipeinstance.As a result of switching to use the
MiddlewareFactoryto prepare middleware, you may now pipeRequestHandlerInterfaceinstances as well. -
route(string $path, $middleware, array $methods = null, string $name) : Routepasses its$middlewareargument to theMiddlewareFactory::prepare()method, and then all arguments to the composedRouteCollectorinstance'sroute()method.As a result of switching to use the
MiddlewareFactoryto prepare middleware, you may now route toRequestHandlerInterfaceinstances as well. -
Each of
get,post,patch,put,delete, andanynow proxy toroute()after marshaling the correct$methods. -
getRoutes() : Route[]proxies to the composedRouteCollectorinstance. -
handle(ServerRequestInterface $request) : ResponseInterfaceproxies to the composedMiddlewarePipeinstance'shandle()method. -
process(ServerRequestInterface $request, RequestHandlerInterface $handler) : ResponseInterfaceproxies to the composedMiddlewarePipeinstance'sprocess()method. -
run() : voidproxies to the composedRequestHandlerRunnerinstance. Please note that the method no longer accepts any arguments.
-
#543 modifies the
Zend\Expressive\Container\ApplicationFactoryto reflect the changes to theZend\Expressive\Applicationclass as detailed above. It pulls the following services to inject via the constructor:Zend\Expressive\MiddlewareFactoryZend\Stratigility\ApplicationPipeline, which should resolve to aMiddlewarePipeinstance; use theZend\Expressive\Container\ApplicationPipelineFactory.Zend\Expressive\Router\RouteCollectorZend\HttpHandlerRunner\RequestHandlerRunner
-
#581 changes how the
ApplicationConfigInjectionDelegator::injectPipelineFromConfig()method works. Previously, it would auto-inject routing and dispatch middleware if routes were configured, but nomiddleware_pipelinewas present. Considering that this method will always be called manually, this functionality was removed; the method now becomes a no-op if nomiddleware_pipelineis present. -
#568 updates the
ErrorHandlerFactoryto pull thePsr\Http\Message\ResponseInterfaceservice, which returns a factory capable of returning a response instance, and passes it to theZend\Stratigility\Middleware\ErrorHandlerinstance it creates, as that class changes in 3.0.0alpha4 such that it now expects a factory instead of an instance. -
#562 extracts most logic from
Zend\Expressive\Middleware\ErrorResponseGeneratorto a new trait,Zend\Expressive\Response\ErrorResponseGeneratorTrait. A trait was used as the classes consuming it are from different namespaces, and thus different inheritance trees. The trait is used by both theErrorResponseGeneratorand the newServerRequestErrorResponseGenerator. -
#551 removes
Zend\Expressive\Container\RouteMiddlewareFactory, as zend-expressive-router now provides a factory for the middleware. -
#551 removes
Zend\Expressive\Container\DispatchMiddlewareFactory, as zend-expressive-router now provides a factory for the middleware. -
#551 removes
Zend\Expressive\Middleware\ImplicitHeadMiddleware, as it is now provided by the zend-expressive-router package. -
#551 removes
Zend\Expressive\Middleware\ImplicitOptionsMiddleware, as it is now provided by the zend-expressive-router package.
Deprecated
- Nothing.
Removed
-
#529 removes support for PHP versions prior to PHP 7.1.
-
#529 removes support for http-interop/http-middleware (previous PSR-15 iteration).
-
#543 removes support for http-interop/http-server-middleware.
-
#580 removes zend-diactoros as a requirement; all usages of it within the package are currently conditional on it being installed, and can be replaced easily with any other PSR-7 implementation at this time.
-
#543 removes the class
Zend\Expressive\Delegate\NotFoundDelegate; useZend\Expressive\Handler\NotFoundHandlerinstead. -
#546 removes the service
Zend\Expressive\Delegate\DefaultDelegate, as there is no longer a concept of a default handler invoked by the application. Instead, developers MUST pipe a request handler or middleware at the innermost layer of the pipeline guaranteed to return a response; we recommend usingZend\Expressive\Handler\NotFoundHandlerfor this purpose. -
#543 removes the class
Zend\Expressive\Middleware\RouteMiddleware. Use theRouteMiddlewarefrom zend-expressive-router instead. -
#543 removes the class
Zend\Expressive\Middleware\DispatchMiddleware. Use theDispatchMiddlewarefrom zend-expressive-router instead; the factoryZend\Expressive\Container\DispatchMiddlewareFactorywill return an instance for you. -
#543 removes the class
Zend\Expressive\Emitter\EmitterStack; use the classZend\HttpHandlerRunner\Emitter\EmitterStackinstead. -
#543 removes the following methods from
Zend\Expressive\Application:pipeRoutingMiddleware(): usepipe(\Zend\Expressive\Router\RouteMiddleware::class)instead.pipeDispatchMiddleware(): usepipe(\Zend\Expressive\Router\DispatchMiddleware::class)instead.getContainer()getDefaultDelegate(): ensure you pipe middleware or a request handler capable of returning a response at the innermost layer;Zend\Expressive\Handler\NotFoundHandlercan be used for this.getEmitter(): use theZend\HttpHandlerRunner\Emitter\EmitterInterfaceservice from the container.injectPipelineFromConfig(): use the newApplicationConfigInjectionDelegatorand/or the static method of the same name it defines.injectRoutesFromConfig(): use the newApplicationConfigInjectionDelegatorand/or the static method of the same name it defines.
-
#543 removes the class
Zend\Expressive\AppFactory.