Cookbook
How can I prepend a common path to all my routes?
You may have multiple middleware in your project, each providing their own functionality:
$app->pipe(UserMiddleware::class);
$app->pipe(ProjectMiddleware::class);
Let's assume the above represents an API.
As your application progresses, you may have a mixture of different content, and now want to have
the above segregated under the path /api
.
To accomplish it, we will pipe an array of middleware under a path, /api
.
When we pipe an array of middleware, internally, Mezzio\Application
creates a new Laminas\Stratigility\MiddlewarePipe
instance, and pipes each
middleware item to it.
When we specify a path, the middleware is decorated with a
Laminas\Stratigility\Middleware\PathMiddlewareDecorator
. This middleware will
compare the request path against the path with which it was created; if they
match, it passes processing on to its middleware.
The following example assumes you are using the structure of
config/pipeline.php
as shipped with the skeleton application.
use Psr\Container\ContainerInterface;
use Mezzio\Application;
use Mezzio\MiddlewareFactory;
/**
* Setup middleware pipeline:
*/
return function (Application $app, MiddlewareFactory $factory, ContainerInterface $container) : void {
// . . .
$app->pipe('/api', [
UserMiddleware::class,
ProjectMiddleware::class,
]);
// . . .
}
Alternately, you can perform the path decoration manually:
use Psr\Container\ContainerInterface;
use Mezzio\Application;
use Mezzio\MiddlewareFactory;
use function Laminas\Stratigility\path;
/**
* Setup middleware pipeline:
*/
return function (Application $app, MiddlewareFactory $factory, ContainerInterface $container) : void {
// . . .
$app->pipe(path('/api', $factory->pipeline(
UserMiddleware::class,
ProjectMiddleware::class
)));
// . . .
}
(Calling $factory->pipeline()
is necessary here to ensure that we create the
MiddlewarePipe
instance, and so that each item in the specified pipeline will
be decorated as Mezzio\Middleware\LazyLoadingMiddleware
.)