echo-fusion / middlewaremanager
a middleware manager implements PSR-15 and PSR-7
Requires
- php: ~8.1.0 || ~8.2.0 || ~8.3.0
- echo-fusion/contracts: ^1.1 || ^2.0
- guzzlehttp/psr7: ^2.5
- psr/container: ^2.0
- psr/http-message: ^2.0
- psr/http-server-middleware: ^1.0
Requires (Dev)
- echo-fusion/codestandard: ^1.0
- friendsofphp/php-cs-fixer: ^3.64
- phpunit/phpunit: ^9.5
- vimeo/psalm: ^5.26
Suggests
None
Provides
None
Conflicts
None
Replaces
None
- dev-main
- v2.1.2
- v2.1.1
- v2.1.0
- v2.0.1
- v2.0.0
- v1.x-dev
- v1.0.2
- v1.0.1
- v1.0.0
- v0.x-dev
- dev-fix/factories-without-webmozart
- dev-chore/allow-contracts-2
- dev-feat/lazy-middleware
- dev-fix/middleware-remove
- dev-chore/unify-tooling-and-docs
- dev-ci/fix-coverage-check
- dev-ci/matrix-and-checks
- dev-refactor/use-contracts-interfaces
This package is auto-updated.
Last update: 2026-10-12 14:47:34 UTC
README
This is a flexible package for managing middleware in PHP applications. It enables you to create a middleware pipeline, where middleware processes a request and passes it on to the next, providing a clean and organized way to handle middleware logic.
This package is compliant with PSR-1, PSR-2, PSR-7 and PSR-15.
Part of EchoFusion, a modular PHP framework built from small packages.
Installation
composer require echo-fusion/middlewaremanager
Requirements
- PHP 8.1, 8.2 or 8.3
Usage
Here’s how to use the MiddlewareManager to set up and run a middleware pipeline.
1. Define handler
Define your handlers in proper directory and pass one of them to middleware manager to run it at the end of the pipeline:
use Psr\Http\Message\ResponseFactoryInterface use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; class MyMiddlewareHandler implements RequestHandlerInterface { public function __construct(private readonly ResponseFactoryInterface $responseFactory) { } public function handle(ServerRequestInterface $request): ResponseInterface { // write your code here return $this->responseFactory->createResponse(); } }
2. Define middlewares
Define your middlewares in proper directory in separate files:
use EchoFusion\MiddlewareManager\MiddlewareManager; use EchoFusion\MiddlewareManager\MiddlewarePipeline; use Psr\Container\ContainerInterface; use Psr\Http\Message\ServerRequestInterface; class CoreMiddleware implements MiddlewareInterface { public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { // ex: manipulate request $request = $request->withAttribute('key','value'); return $handler->handle($request); } } class OtherMiddleware implements MiddlewareInterface { public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { $response = $handler->handle($request); // ex: manipulate response return $this->convertedResponse($response); } }
3. Run MiddlewareManager
To add middleware to the manager, you have two options:
- Add middleware as 'core middleware', which always runs before any middleware added later.
- Add middleware dynamically (e.g., useful for adding route-specific middleware).
Here is an example of how you can run MiddlewareManager:
Note: Don't forget to instantiate below injected dependencies in your container.
use Psr\Container\ContainerInterface; use Psr\Http\Message\ServerRequestInterface; use EchoFusion\Contracts\MiddlewareManager\MiddlewarePipelineInterface; function (ContainerInterface $container, ServerRequestInterface $request, MiddlewarePipelineInterface $pipeline) { // optional $coreMiddlewares = [ CoreMiddleware::class, ]; $middlewareManager = new MiddlewareManager( $container, $pipeline, $coreMiddlewares ); // add or remove your necessary middlewares if you want $middlewareManager->add(OtherMiddleware::class); $middlewareManager->remove(OtherMiddleware::class); // ... // instantiate handler directly or get from container to resolve possible dependencies $handler = new MyMiddlewareHandler(); $response = $middlewareManager->dispatch($request, $handler); echo $response; }
Behaviour worth knowing
- Lazy:
MiddlewareManagerputs a smallLazyMiddlewarestand-in in the pipeline and builds the real middleware from the container only when a request reaches it. A middleware that is never reached (because an earlier one answered) is never built, and each one is built once, not once per request. Classes that are not PSR-15 middleware are rejected when they are added. remove()removes the objects that were added for that class, even if the container builds a new object on everyget().
Testing
composer test
Credits
License
The MIT License (MIT). Please see LICENSE for more information.